UNPKG

chayns-components

Version:

A set of beautiful React components for developing chayns® applications.

205 lines (202 loc) 6.68 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = void 0; var _clsx = _interopRequireDefault(require("clsx")); var _propTypes = _interopRequireDefault(require("prop-types")); var _react = _interopRequireWildcard(require("react")); var _Input = _interopRequireDefault(require("../../react-chayns-input/component/Input")); var _equalizer = _interopRequireDefault(require("../../utils/equalizer")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } /* eslint-disable jsx-a11y/click-events-have-key-events */ const AUTO_HIDE_INPUT_MAX_AMOUNT = 9; class AmountInput extends _react.PureComponent { constructor(props) { super(props); this.onButtonClick = e => { const { amount, onAdd, stopPropagation } = this.props; if (amount <= 0) { onAdd(); } if (stopPropagation) e.stopPropagation(); }; this.onInputChange = value => { const { isReadonly } = this.state; if (isReadonly) { return; } let inputValue = value.replace(/[\D\s]+/g, ''); inputValue = parseInt(inputValue, 10); if (Number.isNaN(inputValue)) { inputValue = ''; } const { onInput } = this.props; if (onInput) { onInput(inputValue); } }; this.onInputBlur = () => { const { onChange } = this.props; let { tempAmount } = this.props; tempAmount = tempAmount === null ? 0 : tempAmount; onChange(tempAmount); this.setState({ isReadonly: true }); }; this.onInputFocus = () => { this.setState({ isReadonly: false }); }; this.setRef = ref => { this.inputRef = ref; }; this.state = { // the input will be set to readonly when not focused to hopefully prevent autofill isReadonly: true }; } componentDidMount() { const { equalize } = this.props; if (equalize) { (0, _equalizer.default)(); } } componentDidUpdate(prevProps) { const { equalize, showInput, focusOnClick } = this.props; if (prevProps.equalize !== equalize) { (0, _equalizer.default)(); } if (showInput && !prevProps.showInput && focusOnClick) { if (this.inputRef) { this.inputRef.focus(); } } } getButtonValue() { const { amount, buttonText, buttonFormatHandler, max } = this.props; if (buttonFormatHandler) { return buttonFormatHandler({ amount, buttonText }); } if (amount > 0 && max !== 1) { return `${amount}`; } return buttonText || 0; } render() { const { amount, disabled, disableInput, autoInput, showInput, equalize, tempValue, contentWidth, stopPropagation } = this.props; const { isReadonly } = this.state; const renderInput = !disabled && !disableInput && (autoInput && amount > AUTO_HIDE_INPUT_MAX_AMOUNT || showInput); return [/*#__PURE__*/_react.default.createElement(_Input.default, { onClick: stopPropagation ? event => event.stopPropagation() : null, key: "amountInput", type: "number", value: tempValue.toString(), onChange: this.onInputChange, className: "cc__amount-control__input", onFocus: this.onInputFocus, onBlur: this.onInputBlur, disabled: disabled, onEnter: this.onInputBlur, customProps: { 'data-cc-equalize-width': equalize, readOnly: chayns.env.isIOS ? undefined : isReadonly }, inputRef: this.setRef, style: { ...{ width: `${contentWidth || 55}px` }, ...(renderInput ? null : { display: 'none' }) } }), /*#__PURE__*/_react.default.createElement("div", { key: "amountDiv", onClick: this.onButtonClick, className: (0, _clsx.default)('cc__amount-control__button', amount ? 'cc__amount-control__button--amount' : 'cc__amount-control__button--price', disabled && "disabled"), "data-cc-equalize-width": equalize, style: { ...(contentWidth ? { width: `${contentWidth}px` } : null), ...(!renderInput ? null : { display: 'none' }) } }, this.getButtonValue())]; } } exports.default = AmountInput; AmountInput.propTypes = { amount: _propTypes.default.number.isRequired, onAdd: _propTypes.default.func.isRequired, onInput: _propTypes.default.func.isRequired, onChange: _propTypes.default.func.isRequired, buttonText: _propTypes.default.string, showInput: _propTypes.default.bool.isRequired, disabled: _propTypes.default.bool, disableInput: _propTypes.default.bool, autoInput: _propTypes.default.bool, buttonFormatHandler: _propTypes.default.func, tempAmount: _propTypes.default.number, tempValue: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]), equalize: _propTypes.default.string, focusOnClick: _propTypes.default.bool, contentWidth: _propTypes.default.number, stopPropagation: _propTypes.default.bool.isRequired }; AmountInput.defaultProps = { buttonText: null, disabled: false, disableInput: false, autoInput: false, buttonFormatHandler: undefined, tempAmount: 0, tempValue: '0', equalize: null, focusOnClick: true, contentWidth: null }; AmountInput.displayName = 'AmountInput'; //# sourceMappingURL=AmountInput.js.map