@prefect9/ui
Version:
UI React components
77 lines (76 loc) • 2.51 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
require("core-js/modules/es.string.trim.js");
require("core-js/modules/web.dom-collections.iterator.js");
var _react = require("react");
var _isType = require("@prefect9/is-type");
function useTextField() {
let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
const {
initial = '',
validators = []
} = options;
if (!(0, _isType.isStr)(initial)) throw new Error('Initial must be string');
const [initialValue, setInitialValue] = (0, _react.useState)(initial);
const [fieldValidators, setFieldValidators] = (0, _react.useState)((0, _isType.ofArr)(validators));
const id = (0, _react.useId)();
const ref = (0, _react.useRef)(null);
const [value, setValue] = (0, _react.useState)(initialValue);
(0, _react.useEffect)(() => {
setInitialValue(initial);
setValue(initial);
}, [initial]);
const editHandler = (0, _react.useCallback)(e => {
if (!ref || !ref.current) return;
const newValue = e.target.value;
setValue(newValue);
}, [ref, setValue]);
const changed = (0, _react.useMemo)(() => value !== initialValue, [value, initialValue]);
const valid = (0, _react.useMemo)(() => {
if (value === initialValue) return true;
let result = true;
for (let validator of fieldValidators) {
if (!(0, _isType.isFunc)(validator)) throw new Error('Validator must be function');
const valid = validator(value);
if (valid === true) continue;
result = valid;
break;
}
return result;
}, [value, initialValue, fieldValidators]);
const anyValid = (0, _react.useMemo)(() => {
let result = true;
for (let validator of fieldValidators) {
if (!(0, _isType.isFunc)(validator)) throw new Error('Validator must be function');
const valid = validator(value);
if (valid === true) continue;
result = valid;
break;
}
return result;
}, [value, initialValue, fieldValidators]);
const empty = (0, _react.useMemo)(() => value.trim().length < 1, [value]);
const clear = (0, _react.useCallback)(() => setValue(''), []);
const clearHandler = (0, _react.useCallback)(e => {
e.preventDefault();
clear();
}, [clear]);
return {
id,
ref,
value,
empty,
changed,
valid,
anyValid,
setValue,
editHandler,
setInitialValue,
clear,
clearHandler
};
}
var _default = exports.default = useTextField;