rsuite
Version:
A suite of react components
73 lines (71 loc) • 2.19 kB
JavaScript
'use client';
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.useField = useField;
var _get = _interopRequireDefault(require("lodash/get"));
var _set = _interopRequireDefault(require("lodash/set"));
var _react = require("react");
var _nameToPath = require("../utils/nameToPath");
function getErrorMessage(error) {
if (typeof error === 'string') {
return error;
}
/**
* When using some components as the field, such as TagInput, and using `ArrayType().of` as the validation rule,
* the error object won't contain the errorMessage directly. @see https://github.com/rsuite/rsuite/issues/3866
*/
if (error?.array && error.array?.length > 0) {
return error.array.find(item => item.hasError)?.errorMessage;
}
if (/*#__PURE__*/(0, _react.isValidElement)(error)) {
return error;
}
return error?.errorMessage;
}
function useField(props) {
const {
name,
formValue,
formError,
value,
nestedField,
errorMessage,
errorFromContext
} = props;
const fieldValue = (0, _react.useMemo)(() => {
if (typeof value !== 'undefined') {
return value;
}
return nestedField ? (0, _get.default)(formValue, name) : formValue?.[name];
}, [formValue, name, nestedField, value]);
const fieldError = (0, _react.useMemo)(() => {
if (typeof errorMessage !== 'undefined' || !errorFromContext) {
return errorMessage;
}
if (nestedField) {
return getErrorMessage((0, _get.default)(formError, (0, _nameToPath.nameToPath)(name)));
}
const fieldError = formError?.[name];
if (typeof fieldError === 'string') {
return fieldError;
}
return getErrorMessage(fieldError);
}, [errorFromContext, errorMessage, formError, name, nestedField]);
const setFieldValue = (0, _react.useCallback)((fieldName, fieldValue) => {
if (nestedField) {
return (0, _set.default)({
...formValue
}, fieldName, fieldValue);
}
return {
...formValue,
[fieldName]: fieldValue
};
}, [formValue, nestedField]);
return {
fieldValue,
fieldError,
setFieldValue
};
}