@ant-design/x
Version:
Craft AI-driven interfaces effortlessly
166 lines (159 loc) • 4.87 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _pickAttrs = _interopRequireDefault(require("@rc-component/util/lib/pickAttrs"));
var _get = _interopRequireDefault(require("@rc-component/util/lib/utils/get"));
var _antd = require("antd");
var _clsx = require("clsx");
var _react = _interopRequireDefault(require("react"));
var _context = require("../context");
function getComponent(components, path, defaultComponent) {
return (0, _get.default)(components, path) || defaultComponent;
}
const TextArea = /*#__PURE__*/_react.default.forwardRef((_, ref) => {
const {
value,
onChange,
onKeyUp,
onKeyDown,
onPaste,
onPasteFile,
disabled,
readOnly,
submitType = 'enter',
prefixCls,
styles = {},
classNames = {},
autoSize,
components,
triggerSend,
placeholder,
onFocus,
onBlur,
...restProps
} = _react.default.useContext(_context.SenderContext);
const inputRef = _react.default.useRef(null);
const insert = (insertValue, positions = 'cursor') => {
const textArea = inputRef.current?.resizableTextArea?.textArea;
// 获取当前文本内容
const currentText = textArea.value;
let startPos = currentText.length;
let endPos = currentText.length;
if (positions === 'cursor') {
startPos = textArea?.selectionStart;
endPos = textArea?.selectionEnd;
}
if (positions === 'start') {
startPos = 0;
endPos = 0;
}
// 在光标位置插入新文本
textArea.value = currentText.substring(0, startPos) + insertValue + currentText.substring(endPos, currentText.length);
// 设置新的光标位置
textArea.selectionStart = startPos + insertValue.length;
textArea.selectionEnd = startPos + insertValue.length;
// 重新聚焦到textarea
textArea.focus();
onChange?.(textArea.value);
};
const clear = () => {
onChange?.('');
};
const getValue = () => {
return {
value: value || '',
slotConfig: []
};
};
_react.default.useImperativeHandle(ref, () => {
return {
nativeElement: inputRef.current?.resizableTextArea?.textArea,
focus: inputRef.current?.focus,
blur: inputRef.current?.blur,
insert,
clear,
getValue
};
});
// ============================ Submit ============================
const isCompositionRef = _react.default.useRef(false);
const onInternalCompositionStart = () => {
isCompositionRef.current = true;
};
const onInternalCompositionEnd = () => {
isCompositionRef.current = false;
};
const onInternalKeyDown = e => {
const eventRes = onKeyDown?.(e);
const {
key,
shiftKey,
ctrlKey,
altKey,
metaKey
} = e;
if (isCompositionRef.current || key !== 'Enter' || eventRes === false) {
return;
}
// 处理Enter键提交
if (key === 'Enter') {
const isModifierPressed = ctrlKey || altKey || metaKey;
const shouldSubmit = submitType === 'enter' && !shiftKey && !isModifierPressed || submitType === 'shiftEnter' && shiftKey && !isModifierPressed;
if (shouldSubmit) {
e.preventDefault();
triggerSend?.();
return;
}
}
};
// ============================ Paste =============================
const onInternalPaste = e => {
// Get files
const files = e.clipboardData?.files;
const text = e.clipboardData?.getData('text/plain');
if (!text && files?.length && onPasteFile) {
onPasteFile(files);
e.preventDefault();
}
onPaste?.(e);
};
const InputTextArea = getComponent(components, ['input'], _antd.Input.TextArea);
const domProps = (0, _pickAttrs.default)(restProps, {
attr: true,
aria: true,
data: true
});
const inputProps = {
...domProps,
ref: inputRef
};
const mergeOnChange = event => {
onChange?.(event.target.value, event);
};
return /*#__PURE__*/_react.default.createElement(InputTextArea, (0, _extends2.default)({}, inputProps, {
disabled: disabled,
style: styles.input,
className: (0, _clsx.clsx)(`${prefixCls}-input`, classNames.input),
autoSize: autoSize,
value: value,
onChange: mergeOnChange,
onKeyUp: onKeyUp,
onCompositionStart: onInternalCompositionStart,
onCompositionEnd: onInternalCompositionEnd,
onKeyDown: onInternalKeyDown,
onPaste: onInternalPaste,
variant: "borderless",
readOnly: readOnly,
placeholder: placeholder,
onFocus: onFocus,
onBlur: onBlur
}));
});
if (process.env.NODE_ENV !== 'production') {
TextArea.displayName = 'TextArea';
}
var _default = exports.default = TextArea;