mui-extended
Version:
Extended UI Components built on Material UI
50 lines (49 loc) • 2.33 kB
JavaScript
import { __assign, __rest } from "tslib";
import { jsx as _jsx } from "react/jsx-runtime";
import { capitalize, isEqualWith, snakeCase, words } from "lodash";
import { forwardRef, memo, useMemo } from "react";
import { debugPropChanges } from "./debug";
import { useFormContext } from "./FormContext";
var labelFromName = function (name) {
return words(snakeCase(name)).map(capitalize).join(" ");
};
export var withFormField = function (FormFieldComponent) {
var PureFormFieldComponent = memo(FormFieldComponent, function (prevProps, nextProps) {
debugPropChanges(prevProps, nextProps);
return isEqualWith(prevProps, nextProps, function (value, other, propName) {
if (propName == "onChange" || propName == "onBlur") {
return true;
}
});
});
var DecoratedFormField = forwardRef(function FormField(_a, ref) {
var children = _a.children, name = _a.name, label = _a.label, props = __rest(_a, ["children", "name", "label"]);
var formContext = useFormContext();
if (!formContext) {
throw new Error("FormField is rendered with out Form");
}
var _label = label || labelFromName(name);
var value = formContext.values[name];
var onChange = useMemo(function () { return function (name, value) {
formContext.onFieldChange(name, value);
if (props.onChange) {
props.onChange(name, value);
}
}; },
// eslint-disable-next-line react-hooks/exhaustive-deps
[props.onChange]);
var onBlur = useMemo(function () { return function (name) {
formContext.onFieldBlur(name);
if (props.onBlur) {
props.onBlur(name);
}
}; },
// eslint-disable-next-line react-hooks/exhaustive-deps
[props.onBlur]);
var error = formContext.errors[name];
var disabled = props.disabled || formContext.isSubmitting;
var helperText = error || props.helperText;
return (_jsx(PureFormFieldComponent, __assign({}, props, { name: name, label: _label, value: value, onChange: onChange, onBlur: onBlur, error: !!error, disabled: disabled, helperText: error || helperText, ref: ref, children: children })));
});
return DecoratedFormField;
};