UNPKG

zarm

Version:

基于 React 的移动端UI库

259 lines (211 loc) 7.97 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = _interopRequireDefault(require("react")); var _bem = require("@zarm-design/bem"); var _icons = require("@zarm-design/icons"); var _button = _interopRequireDefault(require("../button")); var _configProvider = require("../config-provider"); var _customInput = _interopRequireDefault(require("../custom-input")); var _input = _interopRequireDefault(require("../input")); var compareValue = function compareValue(value, max, min) { if (typeof max === 'number') { value = value > max ? max : value; } if (typeof min === 'number') { value = value < min ? min : value; } return value; }; var getPrecision = function getPrecision(value) { var valueStr = value === null || value === void 0 ? void 0 : value.toString(); if (valueStr && valueStr.indexOf('e-') >= 0) { return parseInt(valueStr.slice(valueStr.indexOf('-e')), 10); } var precision = 0; if (valueStr && valueStr.indexOf('.') >= 0) { precision = valueStr.length - valueStr.indexOf('.') - 1; } return precision; }; var getMaxPrecision = function getMaxPrecision(currentValue, step) { var stepPrecision = getPrecision(step); var currentValuePrecision = getPrecision(currentValue); return Math.max(currentValuePrecision, stepPrecision); }; var getPrecisionFactor = function getPrecisionFactor(currentValue, step) { var precision = getMaxPrecision(currentValue, step); return Math.pow(10, precision); }; var formatValue = function formatValue(currentValue, step) { var precision = getMaxPrecision(currentValue, step); // 小数当字符串处理,因为1.00在jstoFixed(2)返回的是字符串 if (precision > 0) { return Number(currentValue).toFixed(precision); } return Number(Number(currentValue).toFixed(precision)); }; var getValue = function getValue(props, defaultValue) { var value = props.value, max = props.max, min = props.min, step = props.step; var tempValue = props.defaultValue === undefined ? defaultValue : props.defaultValue; tempValue = value === undefined ? tempValue : value; return formatValue(compareValue(tempValue, max, min), step); }; var Stepper = /*#__PURE__*/_react.default.forwardRef(function (props, ref) { var _ref; var className = props.className, style = props.style, shape = props.shape, disabled = props.disabled, size = props.size, type = props.type, disableInput = props.disableInput, step = props.step, max = props.max, min = props.min, value = props.value, defaultValue = props.defaultValue, onChange = props.onChange, onInputChange = props.onInputChange; var stepperRef = ref || /*#__PURE__*/_react.default.createRef(); var _React$useState = _react.default.useState(getValue({ value: value, defaultValue: defaultValue, min: min, max: max }, 0)), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), currentValue = _React$useState2[0], setCurrentValue = _React$useState2[1]; var _React$useState3 = _react.default.useState(getValue({ value: value, defaultValue: defaultValue, min: min, max: max, step: step }, 0)), _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2), lastValue = _React$useState4[0], setLastValue = _React$useState4[1]; var _React$useContext = _react.default.useContext(_configProvider.ConfigContext), prefixCls = _React$useContext.prefixCls; var bem = (0, _bem.createBEM)('stepper', { prefixCls: prefixCls }); var onInputChangeCallback = function onInputChangeCallback(newValue) { setCurrentValue(newValue); onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(newValue); }; var onInputBlur = function onInputBlur(newValue) { var newCurrentValue = newValue; if (Number.isNaN(Number(newValue))) { newCurrentValue = lastValue; } newCurrentValue = formatValue(compareValue(newCurrentValue, max, min), step); setCurrentValue(newCurrentValue); setLastValue(newCurrentValue); onChange === null || onChange === void 0 ? void 0 : onChange(newCurrentValue); }; var isSubDisabled = function isSubDisabled() { if (min === null) { return false; } return currentValue <= min || disabled; }; var isPlusDisabled = function isPlusDisabled() { if (max === null) { return false; } return currentValue >= max || disabled; }; var onSubClick = function onSubClick() { if (isSubDisabled()) { return; } var precisionFactor = getPrecisionFactor(currentValue, step); var precision = getMaxPrecision(currentValue, step); var newValue = (precisionFactor * Number(currentValue) - precisionFactor * step) / precisionFactor; onInputBlur(newValue.toFixed(precision)); }; var onPlusClick = function onPlusClick() { if (isPlusDisabled()) { return; } var precisionFactor = getPrecisionFactor(currentValue, step); var precision = getMaxPrecision(currentValue, step); var newValue = (precisionFactor * Number(currentValue) + precisionFactor * step) / precisionFactor; onInputBlur(newValue.toFixed(precision)); }; _react.default.useEffect(function () { var newValue = getValue({ value: value, defaultValue: defaultValue, min: min, max: max, step: step }, 0); setCurrentValue(newValue); setLastValue(newValue); }, [value, defaultValue, min, max, step]); var cls = bem([(_ref = {}, (0, _defineProperty2.default)(_ref, "".concat(shape), !!shape), (0, _defineProperty2.default)(_ref, "".concat(size), !!size), (0, _defineProperty2.default)(_ref, "disabled", disabled), _ref), className]); var inputCls = bem('input', [{ disabled: disableInput }]); var buttonSize = size === 'lg' ? 'sm' : 'xs'; var inputProps = { className: inputCls, type: type, value: currentValue, disabled: disabled || disableInput, clearable: false, onChange: function onChange() { return !disabled && onInputChangeCallback(currentValue); }, onBlur: function onBlur() { return !disabled && onInputBlur(currentValue); } }; return /*#__PURE__*/_react.default.createElement("span", { ref: stepperRef, className: cls, style: style }, /*#__PURE__*/_react.default.createElement(_button.default, { className: bem('sub'), size: buttonSize, disabled: isSubDisabled(), shape: shape, onClick: onSubClick }, /*#__PURE__*/_react.default.createElement(_icons.Minus, null)), ['price'].indexOf(type) > -1 ? /*#__PURE__*/_react.default.createElement(_customInput.default, (0, _extends2.default)({}, inputProps, { onChange: function onChange(v) { return !disabled && onInputChangeCallback(v); } })) : /*#__PURE__*/_react.default.createElement(_input.default, (0, _extends2.default)({}, inputProps, { onChange: function onChange(e) { return !disabled && onInputChangeCallback(e.target.value); } })), /*#__PURE__*/_react.default.createElement(_button.default, { className: bem('plus'), size: buttonSize, disabled: isPlusDisabled(), shape: shape, onClick: onPlusClick }, /*#__PURE__*/_react.default.createElement(_icons.Plus, null))); }); Stepper.displayName = 'Stepper'; Stepper.defaultProps = { shape: 'radius', disabled: false, step: 1, type: 'number', disableInput: false }; var _default = Stepper; exports.default = _default;