UNPKG

acud

Version:

acg react 组件库

327 lines • 13.2 kB
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty"; import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray"; import _extends from "@babel/runtime/helpers/esm/extends"; 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; }; /** * @file Group component * @author liyanan */ import React, { useImperativeHandle, Fragment, useEffect, useState, useCallback } from 'react'; import classNames from 'classnames'; import MultiToneClear from "acud-icon/es/icons/MultiToneClear"; import Popover from '../popover'; import { ConfigContext } from '../config-provider'; import SizeContext from '../config-provider/SizeContext'; import { useLocaleReceiver } from '../locale-provider/LocaleReceiver'; import useCombinedRefs from '../_util/hooks/useCombinedRefs'; export var resolveTargetValue = function resolveTargetValue(event, value) { var newEvent = _extends(_extends({}, event), { target: _extends(_extends({}, event.target), { value: value }) }); return newEvent; }; var Input = /*#__PURE__*/React.forwardRef(function (props, ref) { var _classNames3; var _useLocaleReceiver = useLocaleReceiver('Input'), _useLocaleReceiver2 = _slicedToArray(_useLocaleReceiver, 1), locale = _useLocaleReceiver2[0]; var customizePrefixCls = props.prefixCls, customizeSize = props.size, _props$placeholder = props.placeholder, placeholder = _props$placeholder === void 0 ? locale === null || locale === void 0 ? void 0 : locale.placeholder : _props$placeholder, warning = props.warning, warningPopover = props.warningPopover, warningText = props.warningText, tips = props.tips, disabled = props.disabled, readOnly = props.readOnly, defaultValue = props.defaultValue, limitLength = props.limitLength, label = props.label, prefix = props.prefix, suffix = props.suffix, addonBefore = props.addonBefore, addonAfter = props.addonAfter, className = props.className, allowClear = props.allowClear, onPressEnter = props.onPressEnter, onKeyDown = props.onKeyDown, handleClearAll = props.handleClearAll, onCompositionStart = props.onCompositionStart, onCompositionEnd = props.onCompositionEnd, onPaste = props.onPaste, type = props.type, style = props.style, _props$hidden = props.hidden, hidden = _props$hidden === void 0 ? false : _props$hidden, _props$forbidIfLimit = props.forbidIfLimit, forbidIfLimit = _props$forbidIfLimit === void 0 ? false : _props$forbidIfLimit, rest = __rest(props, ["prefixCls", "size", "placeholder", "warning", "warningPopover", "warningText", "tips", "disabled", "readOnly", "defaultValue", "limitLength", "label", "prefix", "suffix", "addonBefore", "addonAfter", "className", "allowClear", "onPressEnter", "onKeyDown", "handleClearAll", "onCompositionStart", "onCompositionEnd", "onPaste", "type", "style", "hidden", "forbidIfLimit"]); var _useState = useState(props.value || defaultValue || ''), _useState2 = _slicedToArray(_useState, 2), value = _useState2[0], setValue = _useState2[1]; var _useState3 = useState('#D4D6D9'), _useState4 = _slicedToArray(_useState3, 2), clearIconColor = _useState4[0], setClearIconColor = _useState4[1]; var _useState5 = useState(false), _useState6 = _slicedToArray(_useState5, 2), showClearIcon = _useState6[0], setShowClearIcon = _useState6[1]; var _useState7 = useState(''), _useState8 = _slicedToArray(_useState7, 2), focusClass = _useState8[0], setFocusClass = _useState8[1]; // const userTypingRef = React.useRef(false); var composedRef = React.useRef(false); var _useState9 = useState(''), _useState0 = _slicedToArray(_useState9, 2), composingValue = _useState0[0], setComposingValue = _useState0[1]; var innerRef = React.useRef(null); var combinedRef = useCombinedRefs(ref, innerRef); useImperativeHandle(ref, function () { return { blur: function blur() { setFocusClass(''); }, focus: function focus() { combinedRef.current.focus(); } }; }); useEffect(function () { if ('value' in props && value !== props.value) { setComposingValue(props.value || ''); setValue(props.value || ''); if (props.value === 0) { setComposingValue(0); setValue(0); } } if ('label' in props && props.label) { if (props.allowClear) { setShowClearIcon(true); } else { setShowClearIcon(false); } } if (!disabled && !readOnly) { if (value.length && props.allowClear) { setShowClearIcon(true); } } if (props.allowClear && !value.length) { setShowClearIcon(false); } }, [props, value, disabled, readOnly]); var handleFocus = function handleFocus(e) { if (disabled || readOnly) { return; } e.stopPropagation(); setFocusClass('focus'); if (props.onFocus) { props.onFocus(e); } }; var handleBlur = function handleBlur(e) { if (disabled || readOnly) { return; } setFocusClass(''); if (props.onBlur) { props.onBlur(e); } }; var handleOnKeyDown = function handleOnKeyDown(e) { // userTypingRef.current = true; if (onPressEnter && e.key === 'Enter') { if (composedRef.current) { return; } onPressEnter(e); } if (onKeyDown) { onKeyDown(e); } }; var handleOnChange = function handleOnChange(e) { var _a; if (composedRef.current) { setComposingValue(e.target.value); } else { if (forbidIfLimit && limitLength && e.target.value.length >= limitLength) { setComposingValue(e.target.value.slice(0, limitLength)); setValue(e.target.value.slice(0, limitLength)); e.target.value = e.target.value.slice(0, limitLength); } else { setComposingValue(e.target.value); setValue(e.target.value); } if (!e.target.value.length) { setShowClearIcon(false); } (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, e); } }; var handleOuterFocus = function handleOuterFocus() { setFocusClass('focus'); }; var handleOuterBlur = function handleOuterBlur() { setFocusClass(''); }; var handleMouseDownClear = useCallback(function (e) { e.preventDefault(); }, []); var clickClear = function clickClear(e) { if (allowClear) { setShowClearIcon(false); // setValue(''); // 强制转换一下类型 handleOnChange(resolveTargetValue(e, '')); } if (label) { setShowClearIcon(false); } if (handleClearAll) { handleClearAll(); } // console.log('combinedRef', combinedRef); // combinedRef.current.focus(); }; var hoverClear = function hoverClear() { setClearIconColor('#84868C'); }; var clearMouseLeave = function clearMouseLeave() { setClearIconColor('#D4D6D9'); }; var onHandlePaste = function onHandlePaste(e) { if (onPaste) { onPaste(e); } }; var _React$useContext = React.useContext(ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var prefixCls = getPrefixCls('input', customizePrefixCls); var renderPrefix = function renderPrefix() { if (prefix) { return /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-prefix"), "aria-disabled": disabled || readOnly }, prefix); } return null; }; var renderSuffix = function renderSuffix() { if (suffix || limitLength) { return /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-suffix"), "aria-disabled": disabled || readOnly }, suffix, (!disabled || !readOnly) && limitLength && /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-suffix-limit-text") }, /*#__PURE__*/React.createElement("span", { className: classNames(_defineProperty({}, "".concat(prefixCls, "-suffix-warning"), value && value.length > limitLength)) }, value && value.length ? value.length : 0, "/", limitLength)))); } return null; }; var addonClasses = function addonClasses(addon) { return classNames("".concat(prefixCls, "-addon"), _defineProperty({}, "".concat(prefixCls, "-addonOnlyText"), typeof addon === 'string')); }; var renderAddonBefore = function renderAddonBefore() { if (addonBefore) { return /*#__PURE__*/React.createElement("span", { className: addonClasses(addonBefore), "aria-disabled": disabled || readOnly }, addonBefore); } return null; }; var renderAddonAffer = function renderAddonAffer() { if (addonAfter) { return /*#__PURE__*/React.createElement("span", { className: addonClasses(addonAfter), "aria-disabled": disabled || readOnly }, addonAfter); } return null; }; var handleOnCompositionStart = function handleOnCompositionStart(e) { composedRef.current = true; onCompositionStart === null || onCompositionStart === void 0 ? void 0 : onCompositionStart(e); }; var handleOnCompositionEnd = function handleOnCompositionEnd(e) { if (composedRef.current) { composedRef.current = false; handleOnChange(e); } onCompositionEnd === null || onCompositionEnd === void 0 ? void 0 : onCompositionEnd(e); }; var innerValue = composedRef.current ? composingValue : value !== null && value !== void 0 ? value : ''; var size = React.useContext(SizeContext) || customizeSize; var classes = classNames(prefixCls, className, (_classNames3 = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_classNames3, "".concat(prefixCls, "-sm"), size === 'small'), "".concat(prefixCls, "-lg"), size === 'large'), "".concat(prefixCls, "-warning"), warning || warningPopover || value && value.length > limitLength), "".concat(prefixCls, "-has-prefix"), prefix), "".concat(prefixCls, "-has-suffix"), suffix), "".concat(prefixCls, "-has-addon-before"), addonBefore), "".concat(prefixCls, "-has-addon-after"), addonAfter), "".concat(prefixCls, "-label-input"), label), "".concat(prefixCls, "-span-focus"), focusClass), "".concat(prefixCls, "-real-password"), type === 'password'), _defineProperty(_defineProperty(_classNames3, "".concat(prefixCls, "-has-clear"), (!disabled || !readOnly) && allowClear && !label), "".concat(prefixCls, "-has-limit"), limitLength))); var inputDom = /*#__PURE__*/React.createElement("input", _extends({}, rest, { type: type, ref: combinedRef, placeholder: placeholder, value: innerValue, disabled: disabled, readOnly: readOnly, onFocus: handleFocus, onBlur: handleBlur, onKeyDown: handleOnKeyDown, onChange: handleOnChange, onCompositionStart: handleOnCompositionStart, onCompositionEnd: handleOnCompositionEnd, onPaste: onHandlePaste })); var renderInner = function renderInner() { return /*#__PURE__*/React.createElement("span", { className: classes, style: style, "aria-disabled": disabled || readOnly, onFocus: handleOuterFocus, onBlur: handleOuterBlur }, label, renderAddonBefore(), renderPrefix(), /*#__PURE__*/React.cloneElement(inputDom, { value: innerValue }), (!disabled || !readOnly) && showClearIcon && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-clear-wrapper"), onClick: clickClear, onMouseEnter: hoverClear, onMouseLeave: clearMouseLeave, onMouseDown: handleMouseDownClear }, /*#__PURE__*/React.createElement(MultiToneClear, { width: 16, color: clearIconColor })), renderSuffix(), renderAddonAffer()); }; if (!hidden) { var warningTextContent = (!disabled || !readOnly) && !warningPopover && warningText && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-warning-text") }, warningText); var tipsContent = (!disabled || !readOnly) && !warningPopover && !warningText && tips && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-tips") }, tips); return warningText ? /*#__PURE__*/React.createElement(Popover, _extends({ content: /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-warning-popover-text") }, warningText), placement: "bottomLeft" }, warningPopover && !!warningText ? {} : { visible: false }), renderInner(), warningTextContent, tipsContent) : /*#__PURE__*/React.createElement(Fragment, null, renderInner(), warningTextContent, tipsContent); } return null; }); export default Input;