UNPKG

informed

Version:

A lightweight framework and utility for building powerful forms in React applications

112 lines (101 loc) 4.01 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.js'); var React = require('react'); var Context = require('../Context.js'); var useFormController = require('./useFormController.js'); var useFieldSubscription = require('./useFieldSubscription.js'); var debug = require('../debug.js'); var logger = debug.Debug('informed:useConditional' + '\t'); /* ----------------------- useDepends ----------------------- */ var useConditional = function useConditional(_ref) { var name = _ref.name, evaluate = _ref.evaluate, _ref$evaluateWhen = _ref.evaluateWhen, evaluateWhen = _ref$evaluateWhen === void 0 ? [] : _ref$evaluateWhen, _ref$dependsOn = _ref.dependsOn, dependsOn = _ref$dependsOn === void 0 ? [] : _ref$dependsOn, _ref$native = _ref["native"], _native = _ref$native === void 0 ? false : _ref$native, _ref$evaluateOnMount = _ref.evaluateOnMount, evaluateOnMount = _ref$evaluateOnMount === void 0 ? true : _ref$evaluateOnMount; // Grab the form controller var formController = useFormController.useFormController(); // Get scope var scope = React.useContext(Context.ScopeContext); // Need ref to scope because subscriptions will keep ref to it var scopeRef = React.useRef(scope); scopeRef.current = scope; // Conditional state var _useState = React.useState(function () { if (evaluate && evaluateOnMount) { return evaluate({ formState: formController.getFormState(), formApi: formController.getFormApi(), scope: scope, dependsOn: dependsOn }); } return {}; }), _useState2 = _rollupPluginBabelHelpers.slicedToArray(_useState, 2), props = _useState2[0], setProps = _useState2[1]; var check = typeof evaluateWhen === 'function' ? [] : evaluateWhen; var fields = React.useMemo(function () { if (typeof evaluateWhen === 'function') { // Generate fields array with scope // Example: evaluateWhen = scope => [`${scope}.foo`, `${scope}.bar`] return evaluateWhen(scope); } // Example evaluateWhen = ["name", "age"] return evaluateWhen; }, [].concat(_rollupPluginBabelHelpers.toConsumableArray(check), [scope])); var event = _native ? 'field-native' : 'field-value'; // Example evaluateWhen = ["name", "age"] useFieldSubscription.useFieldSubscription(event, fields, function (target, triggers) { logger("re-evaluating ".concat(name, " because ").concat(target, " changed, triggerd by ").concat(JSON.stringify(triggers, null, 2))); var res = evaluate({ formState: formController.getFormState(), formApi: formController.getFormApi(), scope: scopeRef.current, dependsOn: dependsOn, target: target, triggers: triggers }); setProps(res); }, // Note: we pass false because we don't want this to be scoped! // When the user explicitly uses a function! !(typeof evaluateWhen === 'function')); React.useEffect(function () { if (evaluate && evaluateOnMount) { // When name changes we always re evaluate setProps(evaluate({ formState: formController.getFormState(), formApi: formController.getFormApi(), scope: scope, dependsOn: dependsOn })); } }, [name].concat(_rollupPluginBabelHelpers.toConsumableArray(dependsOn))); // Trigger evaluate on a reset of form React.useEffect(function () { var listener = function listener() { if (evaluate && evaluateOnMount) { setProps(evaluate({ formState: formController.getFormState(), formApi: formController.getFormApi(), scope: scope, dependsOn: dependsOn })); } }; formController.emitter.on('reset', listener); return function () { formController.emitter.removeListener('reset', listener); }; }, []); return props; }; exports.useConditional = useConditional;