UNPKG

@braineet/ui

Version:

Braineet design system

228 lines (226 loc) 9.04 kB
var _excluded = ["theme", "type", "disabled", "addonAfter", "field", "min", "max", "form", "step", "onKeyDown", "onChange", "autoRefresh", "onKeyUp", "debounce", "debouncedVal", "iconBefore", "height", "inputBoxStyle", "inputStyle", "currency", "locale", "wrapperProps"]; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; } /* eslint-disable no-loss-of-precision */ /* eslint-disable no-useless-escape */ /* eslint-disable no-nested-ternary */ /* eslint-disable no-restricted-globals */ import React, { useState, useEffect } from 'react'; import { getIn } from 'formik'; import { withTheme } from 'styled-components'; import { currencyFormat, useDebounce } from '../../utils'; import { StyledBox, StyledInput, StyledIconBefore } from './styles'; /** * The `Input` component. */ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; var Input = /*#__PURE__*/React.forwardRef(function (_ref, ref) { var theme = _ref.theme, type = _ref.type, disabled = _ref.disabled, addonAfter = _ref.addonAfter, field = _ref.field, min = _ref.min, max = _ref.max, form = _ref.form, step = _ref.step, onKeyDown = _ref.onKeyDown, onChange = _ref.onChange, autoRefresh = _ref.autoRefresh, onKeyUp = _ref.onKeyUp, debounce = _ref.debounce, debouncedVal = _ref.debouncedVal, iconBefore = _ref.iconBefore, height = _ref.height, inputBoxStyle = _ref.inputBoxStyle, inputStyle = _ref.inputStyle, currency = _ref.currency, locale = _ref.locale, wrapperProps = _ref.wrapperProps, restProps = _objectWithoutPropertiesLoose(_ref, _excluded); var _useState = useState(false), hasFocus = _useState[0], setFocus = _useState[1]; var _useState2 = useState(form && form.values ? getIn(form.values, field.name) : restProps.value), value = _useState2[0], setValue = _useState2[1]; var _useState3 = useState(null), valueEvent = _useState3[0], setValueEvent = _useState3[1]; var valueDebounced = useDebounce(valueEvent, debouncedVal); var valueEventDebounced = debounce ? valueDebounced : valueEvent; useEffect(function () { var newVal = form && form.values ? getIn(form.values, field.name) : restProps.value; if (newVal !== value && autoRefresh) { setValue(newVal); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [form && form.values ? form.values : restProps.value]); useEffect(function () { if (valueEventDebounced && valueEventDebounced.e) { if (onChange) { onChange(valueEventDebounced.e); } else if (form && form.setFieldValue) { form.setFieldValue(field.name, valueEventDebounced.valueTarget); } } // eslint-disable-next-line react-hooks/exhaustive-deps }, [valueEventDebounced]); var onKeyDownEnter = function onKeyDownEnter(e) { if (e.keyCode === 13) { if (!onChange && form && form.setFieldValue) { form.setFieldValue(field.name, value); } } if (onKeyDown) { return onKeyDown(e); } }; var leadingZero = function leadingZero(v) { var res = ''; if (v.indexOf('0') === 0 || v.indexOf('-0') === 0) { for (var i = v[0] === '-' ? 1 : 0; i < v.length && v[i] === '0'; i += 1) { res += '0'; } } return res; }; var onChangeValue = function onChangeValue(e) { e.persist(); var valueTarget = e.target.value; var leadingZeroVal = ''; if ((type === 'number' || type === 'currency' || type === 'percentage') && valueTarget !== '-' && valueTarget !== '') { leadingZeroVal = leadingZero(e.target.value); var val = e.target.value.replace(',', '.').replace('..', '.'); if (step === 0) { valueTarget = parseInt(val, 10); } else { valueTarget = parseFloat(val); if (valueTarget === parseInt(val, 10) && val.indexOf('.') !== -1 && val.substr(val.indexOf('.')).length <= step) { valueTarget += '.'; if (val.indexOf('.') + 1 < val.length && !isNaN(parseInt(val.substr(val.indexOf('.') + 1, step), 10))) { valueTarget += parseInt(val.substr(val.indexOf('.') + 1, step), 10); } } else if (val.indexOf('.') !== -1) { valueTarget = parseFloat(parseFloat(val).toFixed(step)); } } } if ((min === null && max === null && !((type === 'number' || type === 'currency' || type === 'percentage') && isNaN(parseFloat("" + e.target.value) && e.target.value === '-' && e.target.value === '')) || (!isNaN(parseFloat("" + e.target.value)) || e.target.value === '-' || e.target.value === '') && min <= parseFloat("" + valueTarget) && max === null || (!isNaN(parseFloat("" + e.target.value)) || e.target.value === '-' || e.target.value === '') && min === null && max >= parseFloat("" + valueTarget) || (!isNaN(parseFloat("" + e.target.value)) || e.target.value === '-' || e.target.value === '') && min <= parseFloat("" + valueTarget) && max >= parseFloat("" + valueTarget) || e.target.value === '' || e.target.value === '-' && (min === null || min < 0)) && (type !== 'number' && type !== 'currency' && type !== 'percentage' || e.target.value === '-' || e.target.value === '' || parseFloat("" + valueTarget) < 9223372036854775807 && parseFloat("" + valueTarget) > -9223372036854775806)) { var _val = "" + valueTarget; if (_val.length && _val[0] === '-' && (type === 'number' || type === 'currency' || type === 'percentage')) { if (_val === '-0') { _val = "-" + leadingZeroVal; } else { _val = "-" + leadingZeroVal + _val.substr(1); } } else if (type === 'number' || type === 'currency' || type === 'percentage') { if (_val === '0') { _val = leadingZeroVal; } else { _val = leadingZeroVal + _val; } } setValue(_val); e.target.value = _val; e.persist(); setValueEvent({ e: e, valueTarget: _val }); } }; var error = (form == null ? void 0 : form.errors) && (field == null ? void 0 : field.name) && getIn(form.errors, field.name); var touch = (form == null ? void 0 : form.touched) && (field == null ? void 0 : field.name) && getIn(form.touched, field.name); var typeInput = ['text', 'email', 'password', 'hidden'].includes(type) ? type : 'text'; var valInput = form && form.values ? getIn(form.values, field.name) : restProps.value; var localOnChange = function localOnChange(e) { e.persist(); if (onKeyUp) { onChange(e); } else { onChangeValue(e); } }; var localFormat = function localFormat(val) { if (val === null || val === undefined || val === '') { return val; } if (type === 'currency' && currency && locale) { return currencyFormat(val, currency, locale, step).replace(/\s/g, ' '); } if (type === 'percentage') { return val + " %"; } return val; }; var onBlur = function onBlur(e) { setFocus(false); if (restProps && restProps.onBlur) { restProps.onBlur(e); } else if (field && field.onBlur) { field.onBlur(e); } }; var onFocus = function onFocus(e) { setFocus(true); if (restProps && restProps.onFocus) { restProps.onFocus(e); } else if (field && field.onFocus) { field.onFocus(e); } }; var inputValue = !hasFocus ? localFormat(onKeyUp !== null ? valInput : value) : onKeyUp !== null ? valInput : value; if (inputValue === null || inputValue === undefined) { inputValue = ''; } return /*#__PURE__*/_jsxs(StyledBox, _extends({ inputBoxStyle: inputBoxStyle }, wrapperProps, { children: [iconBefore && /*#__PURE__*/_jsx(StyledIconBefore, { name: iconBefore }), /*#__PURE__*/_jsx(StyledInput, _extends({ type: typeInput, isInvalid: touch && error, disabled: disabled, onKeyDown: onKeyDownEnter, onKeyUp: onKeyUp, ref: ref }, field, restProps, { onBlur: onBlur, onFocus: onFocus, $height: height, value: inputValue, onChange: localOnChange, iconBefore: !!iconBefore, inputStyle: inputStyle, min: min, max: max })), addonAfter] })); }); Input.defaultProps = { addonAfter: null, disabled: false, debounce: true, onKeyDown: null, onKeyUp: null, min: null, max: null, autoRefresh: false, theme: {}, onChange: null, debouncedVal: 300, step: 0, height: 40, currency: 'EUR', locale: 'en', type: 'text', field: null, form: null, iconBefore: null, inputBoxStyle: {}, wrapperProps: {}, inputStyle: {} }; export default withTheme(Input);