UNPKG

@appbuckets/react-ui-forms

Version:

An utilities package to manage and create Form using AppBuckets ReactUI

242 lines (234 loc) 7.43 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _tslib = require('../_virtual/_tslib.js'); var React = require('react'); var getValue = require('get-value'); var reactUiCore = require('@appbuckets/react-ui-core'); var reactHookForm = require('react-hook-form'); var HookedForm_context = require('../context/HookedForm.context.js'); function _interopDefaultLegacy(e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty( n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; }, } ); } }); } n['default'] = e; return Object.freeze(n); } var React__namespace = /*#__PURE__*/ _interopNamespace(React); var getValue__default = /*#__PURE__*/ _interopDefaultLegacy(getValue); /* -------- * HookedForm Field Wrapper * -------- */ function createHookedField(options) { // ---- // Deconstruct Options // ---- var Component = options.Component, defaultProps = options.defaultProps, displayName = options.displayName, formatValue = options.formatValue, overrideProps = options.overrideProps, parseValue = options.parseValue, globalValidationRules = options.validation; // ---- // Component Definition // ---- var HookedField = React__namespace.forwardRef(function (receivedProps, ref) { var _a; var props = _tslib.__assign( _tslib.__assign({}, receivedProps), overrideProps ); /** Get render props, merging with overrideProps */ var name = props.name, _b = props.getErrorOnSubmitted, localGetErrorOnSubmitted = _b === void 0 ? true : _b, _c = props.getErrorOnTouched, localGetErrorOnTouched = _c === void 0 ? false : _c, userDefinedBlurHandler = props.onBlur, userDefinedChangeHandler = props.onChange, localValidationRules = props.validation, componentRestProps = _tslib.__rest(props, [ 'name', 'getErrorOnSubmitted', 'getErrorOnTouched', 'onBlur', 'onChange', 'validation', ]); // ---- // Get Controller // ---- var _d = HookedForm_context.useHookedFormContext(), control = _d.control, defaultValues = _d.defaultValues, triggerFieldChanged = _d.triggerFieldChanged; var _e = reactHookForm.useController({ name: name, control: control, rules: _tslib.__assign( _tslib.__assign({}, globalValidationRules), localValidationRules ), }), _f = _e.field, fieldRef = _f.ref, hookFormBlurHandler = _f.onBlur, hookFormChangeHandler = _f.onChange, value = _f.value, formState = _e.formState, fieldState = _e.fieldState; // ---- // Assert on Component Mount that a default value exists // ---- reactUiCore.useEnhancedEffect( function () { /** If default value has not been declared, abort */ if (typeof defaultValues !== 'object' || defaultValues === null) { return; } /** Check default value for field */ if (process.env.NODE_ENV !== 'production') { var defaultValue = getValue__default['default'](defaultValues, name); if (defaultValue === undefined) { global.console.warn( 'Pay Attention : Default value for field ' + "'".concat( name, "' has not been set, it is resolved to undefined." ) ); } } }, // This hooks must be run only once // eslint-disable-next-line react-hooks/exhaustive-deps [] ); // ---- // Build Field Meta // ---- var showError = (localGetErrorOnTouched && fieldState.isTouched) || (localGetErrorOnSubmitted && formState.submitCount > 0); var hasError = (showError && fieldState.invalid) || props.danger; // Field state data must passed directly // because are plain getter and cannot be // enumerated, spread won't work here var meta = { invalid: fieldState.invalid, isTouched: fieldState.isTouched, isDirty: fieldState.isDirty, error: fieldState.error, appearance: { appearance: !hasError ? props.appearance : undefined, danger: hasError, info: !hasError && props.info, primary: !hasError && props.primary, secondary: !hasError && props.secondary, success: !hasError && props.success, warning: !hasError && props.warning, }, isSubmitting: !!formState.isSubmitting, message: (hasError && ((_a = fieldState.error) === null || _a === void 0 ? void 0 : _a.message)) || props.message || props.hint, }; // ---- // Handlers // ---- var handleRef = reactUiCore.useForkRef(ref, fieldRef); var handleBlur = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } /** Invoke the userDefined Blur handler */ if (typeof userDefinedBlurHandler === 'function') { userDefinedBlurHandler.apply( void 0, _tslib.__spreadArray([], _tslib.__read(args), false) ); } /** Invoke the hook-form onBlur handler */ hookFormBlurHandler(); }; var handleChange = function (e, componentProps) { /** If a value parser exists, use it */ var referenceValue = typeof parseValue === 'function' ? parseValue({ event: e, props: componentProps, name: name, meta: meta, }) : e; /** Invoke the userDefined Change handler */ if (typeof userDefinedChangeHandler === 'function') { userDefinedChangeHandler(e, componentProps); } /** Invoke the hook-form onChange handler */ hookFormChangeHandler(referenceValue); }; // ---- // Reformat field value, if a formatter exists // ---- var formattedValue = typeof formatValue === 'function' ? formatValue(value, props) : value; // ---- // Register an effect to trigger field change every time formatted value changed // ---- React__namespace.useEffect( function () { triggerFieldChanged(name, formattedValue); }, [formattedValue, name, triggerFieldChanged] ); // ---- // Component Render // ---- return React__namespace.createElement(Component, { innerRef: handleRef, meta: meta, formState: formState, rest: _tslib.__assign(_tslib.__assign({}, componentRestProps), { onBlur: handleBlur, onChange: handleChange, value: formattedValue, name: name, }), }); }); // ---- // Apply Defaults and DisplayName // ---- HookedField.displayName = displayName || 'HookedField'; HookedField.defaultProps = defaultProps; return HookedField; } exports.createHookedField = createHookedField;