@prefect9/ui
Version:
UI React components
104 lines (102 loc) • 3.99 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 useTextFieldV2(_ref) {
let {
value: initialValue,
initial,
validators,
onEdit: initialEditHandler,
error: initialError
} = _ref;
const id = (0, _react.useId)();
const ref = (0, _react.useRef)(null);
const preparedValue = (0, _react.useMemo)(() => (0, _isType.isStr)(initialValue) ? initialValue : '', [initialValue]);
const preparedInitialValue = (0, _react.useMemo)(() => !(0, _isType.isStr)(initial) ? '' : initial, [initial]);
const changed = (0, _react.useMemo)(() => preparedValue !== preparedInitialValue, [preparedValue, preparedInitialValue]);
const empty = (0, _react.useMemo)(() => preparedValue.trim().length < 1, [preparedValue]);
const [showed, setShowed] = (0, _react.useState)(false);
const showToggle = (0, _react.useCallback)(() => setShowed(!showed), [showed]);
const [focus, setFocus] = (0, _react.useState)(false);
(0, _react.useEffect)(() => {
if (!(0, _isType.isObj)(ref) || !(0, _isType.isObj)(ref.current)) return;
const input = ref.current;
const focusHandler = () => setFocus(true);
input.addEventListener('focus', focusHandler, {
passive: true
});
const blurHandler = () => setFocus(false);
input.addEventListener('blur', blurHandler, {
passive: true
});
return () => {
input.removeEventListener('focus', focusHandler, {
passive: true
});
input.removeEventListener('blur', blurHandler, {
passive: true
});
};
}, [ref]);
const [customError, setCustomError] = (0, _react.useState)(null);
(0, _react.useEffect)(() => setCustomError(null), [preparedValue]);
/*useEffect(() => {
if(!isObj(ref) || !isObj(ref.current)) return;
const input = ref.current
const editHandler = () => setCustomError(null)
input.addEventListener('input', editHandler, { passive:true })
input.addEventListener('change', editHandler, { passive:true })
return () => {
input.removeEventListener('input', editHandler, { passive:true })
input.removeEventListener('change', editHandler, { passive:true })
}
}, [ref])*/
const anyValid = (0, _react.useMemo)(() => {
if ((0, _isType.isStr)(customError) && customError.trim().length > 0) return customError.trim();
if ((0, _isType.isStr)(initialError) && initialError.trim().length > 0) return initialError.trim();
let result = true;
for (let validator of (0, _isType.ofArr)(validators)) {
if (!(0, _isType.isFunc)(validator)) throw new Error('Validator must be function');
const valid = validator(preparedValue);
if (valid === true) continue;
result = valid;
break;
}
return result;
}, [customError, initialError, preparedValue, validators]);
const valid = (0, _react.useMemo)(() => {
if ((0, _isType.isStr)(customError) && customError.trim().length > 0) return customError.trim();
if ((0, _isType.isStr)(initialError) && initialError.trim().length > 0) return initialError.trim();
if (!changed) return true;
return anyValid;
}, [customError, initialError, changed, anyValid]);
const editHandler = (0, _react.useCallback)(e => {
const newValue = e.target.value;
if ((0, _isType.isFunc)(initialEditHandler)) initialEditHandler(newValue);
}, [initialEditHandler]);
const setHandler = (0, _react.useCallback)(newValue => {
if ((0, _isType.isFunc)(initialEditHandler)) initialEditHandler(newValue);
}, [initialEditHandler]);
return {
id,
ref,
value: preparedValue,
changed,
empty,
focus,
anyValid,
valid,
editHandler,
setHandler,
showed,
showToggle,
setError: setCustomError
};
}
var _default = exports.default = useTextFieldV2;