react-bfm
Version:
A basic field / form manager for React using hooks
95 lines (94 loc) • 4.72 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
exports.__esModule = true;
exports.useConnectField = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var _react = require("react");
var _context = require("./context");
var _helpers = require("./helpers");
var _hooks = require("./field/hooks");
var _excluded = ["validator", "dirtyCheck", "transformValueToInput", "transformEventToValue", "onChange", "onFocus", "onBlur"],
_excluded2 = ["namespace", "fieldName", "initialValue"];
var useConnectField = exports.useConnectField = function useConnectField(props) {
var _useContext = (0, _react.useContext)(_context.BFMHooksContext),
blurField = _useContext.blurField,
changeField = _useContext.changeField,
initialValueField = _useContext.initialValueField,
focusField = _useContext.focusField,
initField = _useContext.initField,
removeField = _useContext.removeField;
var validator = props.validator,
dirtyCheck = props.dirtyCheck,
_props$transformValue = props.transformValueToInput,
transformValueToInput = _props$transformValue === void 0 ? _helpers.defaultValueToInput : _props$transformValue,
transformEventToValue = props.transformEventToValue,
onChange = props.onChange,
onFocus = props.onFocus,
onBlur = props.onBlur,
staticProps = (0, _objectWithoutPropertiesLoose2["default"])(props, _excluded);
// For storing static props see bellow.
var propsRef = (0, _react.useRef)(staticProps);
// Hook specific props.
var namespace = staticProps.namespace,
fieldName = staticProps.fieldName,
initialValue = staticProps.initialValue,
otherProps = (0, _objectWithoutPropertiesLoose2["default"])(staticProps, _excluded2);
// Throw an error if namespace and/or fieldName changes after first rendering, because it's not supported
// Dynamically changing these values can result in strange side effects. It's better to render a new component.
var namesRef = (0, _react.useRef)({
namespace: namespace,
fieldName: fieldName
});
(0, _react.useEffect)(function () {
if (namesRef.current.namespace !== namespace || namesRef.current.fieldName !== fieldName) {
throw new Error('Changing the namespace and/or fieldName of an already rendered component is not supported.');
}
}, [namespace, fieldName]);
// Store static props for use in the validator callback.
// This way you can (re-)use for example: required, minlength, maxlength, etc. in the validator
// eslint-disable-next-line react-hooks/refs -- Intentional: avoid recreating getError on every render
propsRef.current = staticProps;
var getError = (0, _react.useCallback)(function (_value) {
return validator && validator(_value, propsRef.current);
}, [validator]);
var value = (0, _hooks.useFieldValue)(namespace, fieldName);
(0, _react.useEffect)(function () {
// init field on mount
initField(namespace, fieldName, initialValue, getError(initialValue));
// remove field on unmount
return function () {
removeField(namespace, fieldName);
};
}, []); // eslint-disable-line react-hooks/exhaustive-deps
// update initialValue on change, see `initialValueField` function for more info
(0, _react.useEffect)(function () {
initialValueField(namesRef.current.namespace, namesRef.current.fieldName, initialValue, getError(initialValue));
}, [initialValueField, getError, initialValue]);
var handleFocus = (0, _react.useCallback)(function (event) {
focusField(namesRef.current.namespace, namesRef.current.fieldName);
if (onFocus) {
onFocus(event);
}
}, [onFocus, focusField]);
var handleChange = (0, _react.useCallback)(function (arg1, arg2, arg3, arg4, arg5) {
var value = transformEventToValue ? transformEventToValue(arg1, arg2, arg3, arg4, arg5) : (0, _helpers.defaultEventToValue)(arg1);
var error = getError(value);
changeField(namesRef.current.namespace, namesRef.current.fieldName, value, error, dirtyCheck);
if (onChange) {
onChange(arg1, arg2, arg3, arg4, arg5);
}
}, [transformEventToValue, getError, changeField, dirtyCheck, onChange]);
var handleBlur = (0, _react.useCallback)(function (event) {
blurField(namesRef.current.namespace, namesRef.current.fieldName);
if (onBlur) {
onBlur(event);
}
}, [onBlur, blurField]);
return (0, _extends2["default"])({}, otherProps, {
value: transformValueToInput(value),
onFocus: handleFocus,
onChange: handleChange,
onBlur: handleBlur
});
};