UNPKG

mobile-more

Version:

基于 antd-mobile v5 扩展移动端 UI 组件

188 lines (187 loc) 7.83 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _ut = require("ut2"); var _utilHelpers = require("util-helpers"); var _rcHooks = require("rc-hooks"); var _antdMobile = require("antd-mobile"); var _config = require("../../../config"); var _normalize = require("../utils/normalize"); require("./SuperInput.css"); var _excluded = ["type", "disabledWhiteSpace", "prefix", "suffix", "onBlur", "max", "min", "precision", "useFloor", "inputMode", "format", "maxLength"]; var prefixCls = "".concat(_config.prefixClass, "-input"); var SuperInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) { var type = _ref.type, disabledWhiteSpace = _ref.disabledWhiteSpace, prefix = _ref.prefix, suffix = _ref.suffix, onBlur = _ref.onBlur, _ref$max = _ref.max, max = _ref$max === void 0 ? Number.MAX_SAFE_INTEGER : _ref$max, _ref$min = _ref.min, min = _ref$min === void 0 ? Number.MIN_SAFE_INTEGER : _ref$min, precision = _ref.precision, useFloor = _ref.useFloor, inputMode = _ref.inputMode, _ref$format = _ref.format, format = _ref$format === void 0 ? true : _ref$format, maxLength = _ref.maxLength, restProps = (0, _objectWithoutProperties2.default)(_ref, _excluded); var internalRef = React.useRef(null); var _useControllableValue = (0, _rcHooks.useControllableValue)(restProps), _useControllableValue2 = (0, _slicedToArray2.default)(_useControllableValue, 2), state = _useControllableValue2[0], setState = _useControllableValue2[1]; var maxLen = React.useMemo(function () { if (typeof maxLength !== 'undefined') { return maxLength; } if (!format) { if (type === 'mobile') { return 11; } else if (type === 'idCard') { return 18; } } return undefined; }, [format, maxLength, type]); var needAdjustPos = React.useMemo(function () { return format && (type === 'mobile' || type === 'bankCard' || type === 'idCard' || type === 'number' || disabledWhiteSpace); }, [disabledWhiteSpace, format, type]); var realType = React.useMemo(function () { if (type === 'mobile') { return 'tel'; } if (type === 'bankCard' || type === 'idCard' || type === 'number' || type === 'email') { return 'text'; } return type; }, [type]); var realInputMode = React.useMemo(function () { if (!inputMode && type === 'number') { return 'decimal'; } return inputMode; }, [type, inputMode]); var calcPosOpts = React.useMemo(function () { var ret = {}; if (type === 'bankCard') { ret.type = 'bankCard'; } else if (type === 'mobile') { ret.type = 'mobile'; } else if (type === 'idCard') { ret.maskReg = /[^\dx]/gi; ret.placeholderChars = []; } else if (type === 'number') { ret.maskReg = /[^\d\\.-]/g; ret.placeholderChars = []; } else if (disabledWhiteSpace) { ret.maskReg = /\s/g; ret.placeholderChars = []; } return ret; }, [type, disabledWhiteSpace]); var normalize = React.useCallback(function (val) { var newValue = val; if (type === 'mobile') { newValue = (0, _normalize.normalizeMobile)(val, format); } else if (type === 'bankCard') { newValue = (0, _normalize.normalizeBankCard)(val, format); } else if (type === 'idCard') { newValue = (0, _normalize.normalizeIdCard)(val, format); } else if (type === 'number') { newValue = (0, _normalize.normalizeNumber)(val); } else if (disabledWhiteSpace) { newValue = (0, _normalize.normalizeNotWhiteSpace)(val); } return newValue; }, [disabledWhiteSpace, format, type]); var handleChange = React.useCallback(function (val) { var _internalRef$current, _internalRef$current2, _internalRef$current3; var inputElement = (_internalRef$current = internalRef.current) === null || _internalRef$current === void 0 ? void 0 : _internalRef$current.nativeElement; var prevPos = (_internalRef$current2 = internalRef.current) === null || _internalRef$current2 === void 0 ? void 0 : (_internalRef$current3 = _internalRef$current2.nativeElement) === null || _internalRef$current3 === void 0 ? void 0 : _internalRef$current3.selectionEnd; var nextCtrlValue = normalize(val); setState(nextCtrlValue); if (inputElement && needAdjustPos) { var adjustPos = (0, _utilHelpers.calculateCursorPosition)(prevPos, state, val, nextCtrlValue, calcPosOpts); if (inputElement) { if (val !== nextCtrlValue) { window.setTimeout(function () { inputElement.selectionStart = inputElement.selectionEnd = adjustPos; }); } else { inputElement.selectionStart = inputElement.selectionEnd = adjustPos; } } } }, [normalize, setState, needAdjustPos, state, calcPosOpts]); // 处理最大最小值,以及精度 var handelBlur = React.useCallback(function (e) { if (type === 'number' && state) { var numberValue = Number(state); if (numberValue > max) { numberValue = max; } else if (numberValue < min) { numberValue = min; } var newValue = typeof precision === 'number' && precision >= 0 ? (useFloor ? (0, _ut.floor)(numberValue, precision) : numberValue).toFixed(precision) : String(numberValue); if (newValue !== state) { setState(newValue); } } onBlur === null || onBlur === void 0 ? void 0 : onBlur(e); }, [type, state, onBlur, max, min, precision, useFloor, setState]); var triggerFocus = React.useCallback(function () { var _internalRef$current4; var inputEl = (_internalRef$current4 = internalRef.current) === null || _internalRef$current4 === void 0 ? void 0 : _internalRef$current4.nativeElement; if (inputEl) { var startPos = inputEl.selectionStart; var endPos = inputEl.selectionEnd; inputEl.focus(); window.setTimeout(function () { inputEl.setSelectionRange(startPos, endPos); }); } }, []); React.useImperativeHandle(ref, function () { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, internalRef.current), {}, { focus: triggerFocus }); }, [triggerFocus]); React.useEffect(function () { // 处理直接通过 form.setFieldsValue 或 initialValues if (state && needAdjustPos) { var newValue = normalize(state); if (newValue !== state) { handleChange(newValue); } } }, [handleChange, needAdjustPos, normalize, type, state]); return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls) }, prefix && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-prefix") }, prefix), /*#__PURE__*/React.createElement(_antdMobile.Input, (0, _objectSpread2.default)((0, _objectSpread2.default)({ inputMode: realInputMode, ref: internalRef, autoComplete: "off" }, restProps), {}, { type: realType, value: state, onChange: handleChange, onBlur: handelBlur, maxLength: maxLen })), suffix && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-suffix") }, suffix)); }); SuperInput.displayName = 'SuperInput'; var _default = exports.default = SuperInput;