preact-arco-design
Version:
Arco Design React UI Library.
169 lines (148 loc) • 6.19 kB
JavaScript
import _typeof from "@babel/runtime/helpers/typeof";
var __assign = this && this.__assign || function () {
__assign = Object.assign || function (t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) {
if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
}
return t;
};
return __assign.apply(this, arguments);
};
var __rest = this && this.__rest || function (s, e) {
var t = {};
for (var p in s) {
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
}
if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
}
return t;
};
import React, { useRef, useImperativeHandle, useEffect } from "preact/compat";
import cs from "../_util/classNames";
import omit from "../_util/omit";
import ResizeObserver from "../_util/resizeObserver";
import IconClose from "../../icon/react-icon/IconClose";
import IconHover from "../_class/icon-hover";
import { isObject } from "../_util/is";
import useComposition from "./useComposition";
var InputComponent = React.forwardRef(function (props, ref) {
var _a;
var allowClear = props.allowClear,
error = props.error,
disabled = props.disabled,
placeholder = props.placeholder,
className = props.className,
style = props.style,
height = props.height,
prefixCls = props.prefixCls,
hasParent = props.hasParent,
size = props.size,
value = props.value,
autoFitWidth = props.autoFitWidth,
onClear = props.onClear,
readOnly = props.readOnly,
onChange = props.onChange,
onKeyDown = props.onKeyDown,
onPressEnter = props.onPressEnter,
propMaxLength = props.maxLength,
rest = __rest(props, ["allowClear", "error", "disabled", "placeholder", "className", "style", "height", "prefixCls", "hasParent", "size", "value", "autoFitWidth", "onClear", "readOnly", "onChange", "onKeyDown", "onPressEnter", "maxLength"]);
var otherProps = omit(rest, ['showWordLimit', 'className', 'defaultValue', 'addBefore', 'addAfter', 'afterStyle', 'beforeStyle', 'prefix', 'suffix']);
var refInput = useRef();
var refInputMirror = useRef();
var refPrevInputWidth = useRef(null);
var maxLength = isObject(propMaxLength) ? propMaxLength.errorOnly ? undefined : propMaxLength.length : propMaxLength;
var _b = useComposition({
value: value,
maxLength: maxLength,
onChange: onChange,
onKeyDown: onKeyDown,
onPressEnter: onPressEnter
}),
compositionValue = _b.compositionValue,
valueChangeHandler = _b.valueChangeHandler,
compositionHandler = _b.compositionHandler,
keyDownHandler = _b.keyDownHandler,
triggerValueChangeCallback = _b.triggerValueChangeCallback;
var inputClassNames = cs(prefixCls, prefixCls && (_a = {}, _a["".concat(prefixCls, "-size-").concat(size)] = size, _a["".concat(prefixCls, "-error")] = error, _a["".concat(prefixCls, "-disabled")] = disabled, _a), hasParent ? undefined : className);
useImperativeHandle(ref, function () {
return {
dom: refInput.current,
focus: function focus() {
refInput.current && refInput.current.focus && refInput.current.focus();
},
blur: function blur() {
refInput.current && refInput.current.blur && refInput.current.blur();
}
};
}, []);
var updateInputWidth = function updateInputWidth() {
if (refInputMirror.current && refInput.current) {
var width = refInputMirror.current.offsetWidth;
refInput.current.style.width = "".concat(width + (width ? 8 : 4), "px");
}
}; // 设定 <input> 初始宽度,之后的更新交由 ResizeObserver 触发
useEffect(function () {
return autoFitWidth && updateInputWidth();
}, []);
var inputProps = __assign(__assign({
'aria-invalid': error
}, otherProps), {
readOnly: readOnly,
maxLength: maxLength,
disabled: disabled,
placeholder: placeholder,
value: compositionValue || value || '',
className: inputClassNames,
onKeyDown: keyDownHandler,
onChange: valueChangeHandler,
onCompositionStart: compositionHandler,
onCompositionUpdate: compositionHandler,
onCompositionEnd: compositionHandler
});
var mirrorValue = inputProps.value || placeholder;
return React.createElement(React.Fragment, null, allowClear ? React.createElement(React.Fragment, null, React.createElement("input", __assign({
ref: refInput
}, inputProps)), !readOnly && !disabled && allowClear && value ? React.createElement(IconHover, {
className: "".concat(prefixCls, "-clear-icon"),
onClick: function onClick(e) {
e.stopPropagation();
if (refInput.current && refInput.current.focus) {
refInput.current.focus();
}
triggerValueChangeCallback('', e);
onClear && onClear();
}
}, React.createElement(IconClose // keep focus status
, {
// keep focus status
onMouseDown: function onMouseDown(e) {
e.preventDefault();
}
})) : null) : React.createElement("input", __assign({
ref: refInput
}, inputProps, {
style: hasParent ? {} : __assign(__assign({}, style), 'height' in props ? {
height: height
} : {})
})), autoFitWidth && React.createElement(ResizeObserver, {
onResize: function onResize() {
var inputWidth = refInputMirror.current.offsetWidth;
if (_typeof(autoFitWidth) === 'object') {
var delay = typeof autoFitWidth.delay === 'function' ? autoFitWidth.delay(inputWidth, refPrevInputWidth.current) : autoFitWidth.delay;
delay ? setTimeout(updateInputWidth, delay) : updateInputWidth();
} else {
updateInputWidth();
}
refPrevInputWidth.current = inputWidth;
}
}, React.createElement("span", {
className: "".concat(prefixCls, "-mirror"),
ref: refInputMirror
}, mirrorValue && mirrorValue.replace(/\s/g, "\xA0"))));
});
InputComponent.displayName = 'InputComponent';
export default InputComponent;