@chakra-ui/core
Version:
Responsive and accessible React UI components built with React and Emotion
318 lines (262 loc) • 9.36 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _exenv = require("exenv");
var _react = require("react");
var _utils = require("./utils");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function useLongPress(callback, speed) {
var _ref;
if (callback === void 0) {
callback = function callback() {};
}
if (speed === void 0) {
speed = 200;
}
var _useState = (0, _react.useState)(false),
isPressed = _useState[0],
setIsPressed = _useState[1];
(0, _react.useEffect)(function () {
var timerId;
if (isPressed) {
timerId = setTimeout(callback, speed);
} else {
clearTimeout(timerId);
}
return function () {
clearTimeout(timerId);
};
}, [isPressed, callback, speed]);
var start = (0, _react.useCallback)(function () {
callback();
setIsPressed(true);
}, [callback]);
var stop = (0, _react.useCallback)(function () {
setIsPressed(false);
}, []);
var clickEvent = _exenv.canUseDOM && !!document.documentElement.ontouchstart ? "onTouchStart" : "onMouseDown";
return _ref = {}, _ref[clickEvent] = start, _ref.onMouseUp = stop, _ref.onMouseLeave = stop, _ref.onTouchEnd = stop, _ref;
}
function useNumberInput(_ref2) {
var valueProp = _ref2.value,
onChange = _ref2.onChange,
defaultValue = _ref2.defaultValue,
_ref2$focusInputOnCha = _ref2.focusInputOnChange,
focusInputOnChange = _ref2$focusInputOnCha === void 0 ? true : _ref2$focusInputOnCha,
_ref2$clampValueOnBlu = _ref2.clampValueOnBlur,
clampValueOnBlur = _ref2$clampValueOnBlu === void 0 ? true : _ref2$clampValueOnBlu,
_ref2$keepWithinRange = _ref2.keepWithinRange,
keepWithinRange = _ref2$keepWithinRange === void 0 ? true : _ref2$keepWithinRange,
_ref2$min = _ref2.min,
min = _ref2$min === void 0 ? -Infinity : _ref2$min,
_ref2$max = _ref2.max,
max = _ref2$max === void 0 ? Infinity : _ref2$max,
_ref2$step = _ref2.step,
stepProp = _ref2$step === void 0 ? 1 : _ref2$step,
precisionProp = _ref2.precision,
getAriaValueText = _ref2.getAriaValueText,
isReadOnly = _ref2.isReadOnly,
isInvalid = _ref2.isInvalid,
isDisabled = _ref2.isDisabled;
var _useRef = (0, _react.useRef)(valueProp != null),
isControlled = _useRef.current;
var defaultPrecision = Math.max((0, _utils.calculatePrecision)(stepProp), 0);
var precision = precisionProp || defaultPrecision;
var _useState2 = (0, _react.useState)(function () {
if (defaultValue != null) {
var nextValue = defaultValue;
if (keepWithinRange) {
nextValue = Math.max(Math.min(nextValue, max), min);
}
nextValue = (0, _utils.roundToPrecision)(nextValue, precision);
return nextValue;
}
return "";
}),
valueState = _useState2[0],
setValue = _useState2[1];
var _useState3 = (0, _react.useState)(false),
isFocused = _useState3[0],
setIsFocused = _useState3[1];
var value = isControlled ? valueProp : valueState;
var isInteractive = !(isReadOnly || isDisabled);
var inputRef = (0, _react.useRef)();
var prevNextValue = (0, _react.useRef)(null);
var shouldConvertToNumber = function shouldConvertToNumber(value) {
var hasDot = value.indexOf(".") > -1;
var hasTrailingZero = value.substr(value.length - 1) === "0";
var hasTrailingDot = value.substr(value.length - 1) === ".";
if (hasDot && hasTrailingZero) return false;
if (hasDot && hasTrailingDot) return false;
return true;
};
var updateValue = function updateValue(nextValue) {
//eslint-disable-next-line
if (prevNextValue.current == nextValue) return;
var shouldConvert = shouldConvertToNumber(nextValue);
var converted = shouldConvert ? +nextValue : nextValue;
if (!isControlled) setValue(converted);
if (onChange) onChange(converted);
prevNextValue.current = nextValue;
};
var handleIncrement = function handleIncrement(step) {
if (step === void 0) {
step = stepProp;
}
if (!isInteractive) return;
var nextValue = Number(value) + Number(step);
if (keepWithinRange) {
nextValue = Math.min(nextValue, max);
}
nextValue = (0, _utils.roundToPrecision)(nextValue, precision);
updateValue(nextValue);
focusInput();
};
var handleDecrement = function handleDecrement(step) {
if (step === void 0) {
step = stepProp;
}
if (!isInteractive) return;
var nextValue = Number(value) - Number(step);
if (keepWithinRange) {
nextValue = Math.max(nextValue, min);
}
nextValue = (0, _utils.roundToPrecision)(nextValue, precision);
updateValue(nextValue);
focusInput();
};
var focusInput = function focusInput() {
if (focusInputOnChange && inputRef.current && _exenv.canUseDOM) {
requestAnimationFrame(function () {
inputRef.current.focus();
});
}
};
var incrementStepperProps = useLongPress(handleIncrement);
var decrementStepperProps = useLongPress(handleDecrement);
var handleChange = function handleChange(event) {
updateValue(event.target.value);
};
var handleKeyDown = function handleKeyDown(event) {
(0, _utils.preventNonNumberKey)(event);
if (!isInteractive) return;
if (event.key === "ArrowUp") {
event.preventDefault();
var ratio = getIncrementFactor(event);
handleIncrement(ratio * stepProp);
}
if (event.key === "ArrowDown") {
event.preventDefault();
var _ratio = getIncrementFactor(event);
handleDecrement(_ratio * stepProp);
}
if (event.key === "Home") {
event.preventDefault();
if (min != null) {
updateValue(max);
}
}
if (event.key === "End") {
event.preventDefault();
if (max != null) {
updateValue(min);
}
}
};
var getIncrementFactor = function getIncrementFactor(event) {
var ratio = 1;
if (event.metaKey || event.ctrlKey) {
ratio = 0.1;
}
if (event.shiftKey) {
ratio = 10;
}
return ratio;
};
var validateAndClamp = function validateAndClamp() {
var maxExists = max != null;
var minExists = min != null;
if (maxExists && value > max) {
updateValue(max);
}
if (minExists && value < min) {
updateValue(min);
}
};
var isOutOfRange = value > max || value < min;
var ariaValueText = getAriaValueText ? getAriaValueText(value) : null;
return {
value: value,
isFocused: isFocused,
isDisabled: isDisabled,
isReadOnly: isReadOnly,
incrementStepper: incrementStepperProps,
decrementStepper: decrementStepperProps,
incrementButton: _objectSpread({
onClick: function onClick() {
return handleIncrement();
},
"aria-label": "add"
}, keepWithinRange && {
disabled: value === max,
"aria-disabled": value === max
}),
decrementButton: _objectSpread({
onClick: function onClick() {
return handleDecrement();
},
"aria-label": "subtract"
}, keepWithinRange && {
disabled: value === min,
"aria-disabled": value === min
}),
input: _objectSpread({
onChange: handleChange,
onKeyDown: handleKeyDown,
ref: inputRef,
value: value,
role: "spinbutton",
type: "text",
"aria-valuemin": min,
"aria-valuemax": max,
"aria-disabled": isDisabled,
"aria-valuenow": value,
"aria-invalid": isInvalid || isOutOfRange
}, getAriaValueText && {
"aria-valuetext": ariaValueText
}, {
readOnly: isReadOnly,
disabled: isDisabled,
autoComplete: "off",
onFocus: function onFocus() {
setIsFocused(true);
},
onBlur: function onBlur() {
setIsFocused(false);
if (clampValueOnBlur) {
validateAndClamp();
}
}
}),
hiddenLabel: {
"aria-live": "polite",
children: getAriaValueText ? ariaValueText : value,
style: {
position: "absolute",
clip: "rect(0px, 0px, 0px, 0px)",
height: 1,
width: 1,
margin: -1,
whiteSpace: "nowrap",
border: 0,
overflow: "hidden",
padding: 0
}
}
};
}
var _default = useNumberInput;
exports["default"] = _default;
;