UNPKG

@react-md/form

Version:

This package is for creating all the different form input types.

141 lines 6.01 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; import { useCallback, useRef, useState } from "react"; import { withinRange } from "@react-md/utils"; import { useTextField } from "./useTextField"; export function useNumberField(_a) { var id = _a.id, defaultValue = _a.defaultValue, theme = _a.theme, pattern = _a.pattern, required = _a.required, minLength = _a.minLength, maxLength = _a.maxLength, _b = _a.disableMaxLength, disableMaxLength = _b === void 0 ? false : _b, onBlur = _a.onBlur, onChange = _a.onChange, helpText = _a.helpText, errorIcon = _a.errorIcon, _c = _a.counter, counter = _c === void 0 ? false : _c, _d = _a.disableMessage, disableMessage = _d === void 0 ? false : _d, _e = _a.validateOnChange, validateOnChange = _e === void 0 ? "number-recommended" : _e, isErrored = _a.isErrored, onErrorChange = _a.onErrorChange, getErrorIcon = _a.getErrorIcon, getErrorMessage = _a.getErrorMessage, min = _a.min, max = _a.max, step = _a.step, _f = _a.fixOnBlur, fixOnBlur = _f === void 0 ? true : _f, _g = _a.updateOnChange, updateOnChange = _g === void 0 ? true : _g; var _h = __read(useState(defaultValue), 2), number = _h[0], setNumber = _h[1]; var initial = useRef(number); var handleBlur = useCallback(function (event) { if (onBlur) { onBlur(event); } if (event.isPropagationStopped()) { return; } var input = event.currentTarget; input.setCustomValidity(""); input.checkValidity(); if (!fixOnBlur || // do nothing else since it's a weird value like: `"--0"` which causes // the value to be `""` and `numberAsValue` to be `NaN` input.validity.badInput || (input.validity.rangeUnderflow && fixOnBlur === "max") || (input.validity.rangeOverflow && fixOnBlur === "min")) { return; } var value = input.valueAsNumber; if (input.value === "" && typeof initial.current === "number") { value = min !== null && min !== void 0 ? min : initial.current; } // can't have both rangeUnderflow and rangeOverflow at the same time, so // it's "safe" to always provide both value = withinRange(value, min, max); if (!Number.isNaN(value)) { setNumber(value); input.value = "".concat(value); } else if (typeof initial.current === "undefined") { setNumber(undefined); } }, [onBlur, fixOnBlur, min, max]); var handleChange = useCallback(function (event) { if (onChange) { onChange(event); } if (event.isPropagationStopped() || !updateOnChange) { return; } var input = event.currentTarget; input.checkValidity(); var value = withinRange(event.currentTarget.valueAsNumber, min, max); if (!input.validity.valid && !input.validity.rangeUnderflow && !input.validity.rangeOverflow) { return; } if (!Number.isNaN(value)) { setNumber(value); } else if (initial.current === undefined) { setNumber(undefined); } }, [onChange, updateOnChange, min, max]); var _j = __read(useTextField({ id: id, defaultValue: "".concat(number !== null && number !== void 0 ? number : ""), theme: theme, pattern: pattern, required: required, minLength: minLength, maxLength: maxLength, disableMaxLength: disableMaxLength, onBlur: handleBlur, onChange: handleChange, helpText: helpText, errorIcon: errorIcon, counter: counter, disableMessage: disableMessage, validateOnChange: validateOnChange, isErrored: isErrored, onErrorChange: onErrorChange, getErrorIcon: getErrorIcon, getErrorMessage: getErrorMessage, }), 3), props = _j[1], setState = _j[2].setState; var reset = useCallback(function () { var _a; setNumber(initial.current); setState({ value: "".concat((_a = initial.current) !== null && _a !== void 0 ? _a : ""), error: false, errorMessage: "", }); }, [setState]); var updateNumber = useCallback(function (value) { if (typeof value === "function") { setNumber(function (prevNumber) { var updated = value(prevNumber); setState(function (prevState) { return (__assign(__assign({}, prevState), { value: "".concat(updated !== null && updated !== void 0 ? updated : "") })); }); return updated; }); return; } setNumber(value); setState(function (prevState) { return (__assign(__assign({}, prevState), { value: "".concat(value !== null && value !== void 0 ? value : "") })); }); }, [setState]); return [ number, __assign(__assign({}, props), { min: min, max: max, step: step, type: "number" }), { reset: reset, setNumber: updateNumber, }, ]; } //# sourceMappingURL=useNumberField.js.map