UNPKG

react-hook-currency

Version:

> This libraries propose to introduce two pseudo hooks, one capable of format currencies and another capable to simulate a cash register.

433 lines (361 loc) 13.7 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); (function () { if (typeof window.CustomEvent === 'function') return false; //If not IE function CustomEvent(event, params) { params = params || { bubbles: false, cancelable: false, detail: undefined }; var evt = document.createEvent('CustomEvent'); evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); return evt; } CustomEvent.prototype = window.Event.prototype; window.CustomEvent = CustomEvent; window.Event = CustomEvent; })(); if (!Array.prototype.includes) { Array.prototype.includes = function (str) { var returnValue = false; if (this.indexOf(str) !== -1) { returnValue = true; } return returnValue; }; } if (!String.prototype.includes) { String.prototype.includes = function (str) { var returnValue = false; if (this.indexOf(str) !== -1) { returnValue = true; } return returnValue; }; } if (!Array.prototype.find) { Array.prototype.find = function (predicate) { if (this == null) { throw new TypeError('Array.prototype.find called on null or undefined'); } if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { if (i in list) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return value; } } } return undefined; }; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } (function (Currencies) { Currencies["Australian Dollar"] = "AUD"; Currencies["Brazilian Real"] = "BRL"; Currencies["Canadian Dollar"] = "CAD"; Currencies["Euro"] = "EUR"; Currencies["Pound Sterling"] = "GBP"; Currencies["US Dollar"] = "USD"; Currencies["Swiss Franc"] = "CHF"; })(exports.Currencies || (exports.Currencies = {})); (function (Locales) { Locales["English"] = "en"; Locales["English (Australia)"] = "en-AU"; Locales["English (Canada)"] = "en-CA"; Locales["English (United Kingdom)"] = "en-GB"; Locales["English (United States)"] = "en-US"; Locales["Swiss German"] = "gsw"; Locales["Swiss German (Switzerland)"] = "gsw-CH"; Locales["Portuguese (Brazil)"] = "pt-BR"; Locales["Portuguese"] = "pt"; })(exports.Locales || (exports.Locales = {})); function removeNonNumerics(raw) { return raw == null ? void 0 : raw.replace(/[^0-9]/g, ''); } function removeNonNumericsExceptDash(raw) { var dash = (raw == null ? void 0 : raw.charAt(0)) === '-' ? '-' : ''; return "" + dash + (raw == null ? void 0 : raw.replace(/[^0-9]/g, '')); } function removeNonRegister(raw, decimalSeparator) { var regex = new RegExp("[^0-9\\/\\=\\+\\-\\*\\" + decimalSeparator + "]", 'g'); return raw ? raw.replace(regex, '') : raw; } function getOperators(raw) { return removeNonRegister(raw).substr(1).split(/[^\+\-\*\/]/).filter(String); } function getNumbers(raw, decimalSeparator) { var regex = new RegExp("[^0-9\\" + decimalSeparator + "]", 'g'); return removeNonRegister(raw, decimalSeparator).split(regex).filter(String).map(function (v, idx) { return idx === 0 ? "" + hasDash(raw) + v : v; }); } function hasDash(raw) { return raw.charAt(0) === '-' ? '-' : ''; } function getDecimalSeparator(locale) { var n = 1.1; return n.toLocaleString(locale).substring(1, 2); } function calculator(num1, num2, operator, decimalSeparator) { var _eval; var val1 = Number(num1.split(decimalSeparator).join('.')); var val2 = Number(num2.split(decimalSeparator).join('.')); return (_eval = eval("" + val1 + operator + val2)) == null ? void 0 : _eval.toFixed(2); } function replaceAllCalc(value) { if (value.includes('x')) { value = value.split('x').join('*'); } if (value.includes('÷')) { value = value.split('÷').join('/'); } return value; } function replaceAllNoCalc(value) { if (value.includes('*')) { value = value.split('*').join('x'); } if (value.includes('/')) { value = value.split('/').join('÷'); } return value; } var defaultValues = { precision: 2, style: 'currency', locale: exports.Locales['Portuguese (Brazil)'], currency: exports.Currencies['Brazilian Real'], negative: 'allow' }; var useCurrency = function useCurrency(props) { var _defaultValues$props = _extends({}, defaultValues, props), style = _defaultValues$props.style, locale = _defaultValues$props.locale, precision = _defaultValues$props.precision, currency = _defaultValues$props.currency, negative = _defaultValues$props.negative; var decimalSeparator = getDecimalSeparator(locale); var toNumber = function toNumber(currency) { return Number(removeNonNumericsExceptDash(currency)) / Math.pow(10, precision); }; var formatCurrency = function formatCurrency(value) { return "" + formatNegative(value) + (Number(removeNonNumerics(value)) / Math.pow(10, precision)).toLocaleString(locale, { style: style, currency: currency, minimumIntegerDigits: 1, minimumFractionDigits: precision }); }; var formatNegative = function formatNegative(value) { var dash = ''; var firstEntry = value == null ? void 0 : value.charAt(0); var lastEntry = value == null ? void 0 : value.substring((value == null ? void 0 : value.length) - 1); if (negative === 'always') { dash = '-'; } else if (negative === 'allow') { if (lastEntry === '-') { if (firstEntry !== '-') { dash = '-'; } } else if (firstEntry === '-') { dash = '-'; } } return dash; }; // keep cursor to right var onClick = function onClick(e) { e.currentTarget.setSelectionRange(e.currentTarget.value.length, e.currentTarget.value.length); }; var onChange = function onChange(e) { var value = e.currentTarget.value; e.currentTarget.value = formatCurrency(value); }; var onKeyDown = function onKeyDown(e) { if (['Delete'].includes(e.key)) { var input = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value'); var nativeInputValueSetter = input == null ? void 0 : input.set; if (nativeInputValueSetter) { var _e$currentTarget; var value = e.currentTarget.value; nativeInputValueSetter.call(e.currentTarget, value.substring(0, value.length - 1)); var event = new Event('input', { bubbles: true }); (_e$currentTarget = e.currentTarget) == null ? void 0 : _e$currentTarget.dispatchEvent(event); } } }; return { onClick: onClick, onChange: onChange, onKeyDown: onKeyDown, format: formatCurrency, decimalSeparator: decimalSeparator, toNumber: toNumber }; }; var operators = ['-', '+', '/', '*']; var defaultValues$1 = { precision: 2, style: 'currency', locale: exports.Locales['Portuguese (Brazil)'], currency: exports.Currencies['Brazilian Real'] }; var useCurrencyRegister = function useCurrencyRegister(props) { var _defaultValues$props = _extends({}, defaultValues$1, props), style = _defaultValues$props.style, locale = _defaultValues$props.locale, precision = _defaultValues$props.precision, currency = _defaultValues$props.currency; var decimalSeparator = getDecimalSeparator(locale); var toNumber = function toNumber(currency) { return Number(removeNonNumericsExceptDash(currency)) / Math.pow(10, precision); }; var formatCurrency = function formatCurrency(value, decimal) { return (Number(removeNonNumericsExceptDash(value)) / Math.pow(10, precision)).toLocaleString(locale, { style: decimal || style, currency: currency, minimumIntegerDigits: 1, minimumFractionDigits: precision }); }; var isMathematicOperator = function isMathematicOperator(lastChar) { return operators.includes(lastChar); }; var isMathematicOperation = function isMathematicOperation(value) { var operation = value.substr(1); return operators.find(function (o) { return operation.includes(o); }); }; var calculateValue = function calculateValue(numbers, operators) { var value = ''; if (operators.length && numbers.length > 1) { value = String(calculator(numbers[0], numbers[1], operators[0], decimalSeparator)); } return value; }; // keep cursor to right var onClick = function onClick(e) { e.currentTarget.setSelectionRange(e.currentTarget.value.length, e.currentTarget.value.length); }; var onChange = function onChange(e) { var value = replaceAllCalc(e.currentTarget.value); var lastChar = value.slice(-1); var operators = getOperators(value); var numbers = getNumbers(value, decimalSeparator); if (isMathematicOperator(lastChar)) { if (operators.length === 1) { var _operators$; e.currentTarget.value = formatCurrency(numbers == null ? void 0 : numbers[0]) + " " + (operators == null ? void 0 : (_operators$ = operators[0]) == null ? void 0 : _operators$.slice(-1)) + " "; } else { var calculatedValue = calculateValue(numbers, operators); if (!!value) { e.currentTarget.value = formatCurrency(calculatedValue) + " " + (operators == null ? void 0 : operators[operators.length - 1]); } } } else { var _numbers$, _numbers$$substr, _numbers$2; if (lastChar === decimalSeparator && numbers != null && (_numbers$ = numbers[1]) != null && (_numbers$$substr = _numbers$.substr(0, (numbers == null ? void 0 : (_numbers$2 = numbers[1]) == null ? void 0 : _numbers$2.length) - 1)) != null && _numbers$$substr.includes(decimalSeparator)) { e.currentTarget.value = value.substr(0, value.length - 1); } else if (isMathematicOperation(removeNonRegister(value))) { var _calculatedValue = ''; if (lastChar === '=') { if (numbers.length === 1) { _calculatedValue = numbers == null ? void 0 : numbers[0]; } else { _calculatedValue = calculateValue(numbers, operators); } } if (!!_calculatedValue) { e.currentTarget.value = formatCurrency(_calculatedValue); } else { e.currentTarget.value = formatCurrency(numbers == null ? void 0 : numbers[0]) + " " + (operators == null ? void 0 : operators[0]) + " " + (['-', '+'].includes(operators == null ? void 0 : operators[0]) ? formatCurrency(numbers == null ? void 0 : numbers[1], 'decimal') : (numbers == null ? void 0 : numbers[1]) || ''); } } else { e.currentTarget.value = formatCurrency(value); } } e.currentTarget.value = replaceAllNoCalc(e.currentTarget.value); }; var triggerChange = function triggerChange(value, input) { if (!!input) { var actualValue = input == null ? void 0 : input.value; var inputProp = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value'); var nativeInputValueSetter = inputProp == null ? void 0 : inputProp.set; if (nativeInputValueSetter) { var event = new Event('input', { bubbles: true }); switch (value) { case 'L': var keyboardEvent = new KeyboardEvent('keydown', { bubbles: true, key: 'Delete' }); input == null ? void 0 : input.dispatchEvent(keyboardEvent); break; case 'C': nativeInputValueSetter == null ? void 0 : nativeInputValueSetter.call(input, ""); input == null ? void 0 : input.dispatchEvent(event); break; default: nativeInputValueSetter == null ? void 0 : nativeInputValueSetter.call(input, "" + actualValue + value); input == null ? void 0 : input.dispatchEvent(event); break; } } } }; var onKeyDown = function onKeyDown(e) { if (['Delete', 'Backspace'].includes(e.key)) { e.preventDefault(); var input = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value'); var nativeInputValueSetter = input == null ? void 0 : input.set; if (nativeInputValueSetter) { var _e$currentTarget; var value = e.currentTarget.value.trim(); var numbers = getNumbers(value, decimalSeparator); var zeros = removeNonNumerics(numbers == null ? void 0 : numbers[1]); nativeInputValueSetter == null ? void 0 : nativeInputValueSetter.call(e.currentTarget, Number(zeros) === 0 ? value.substring(0, value.length - 5) : value.substring(0, value.length - 1)); var event = new Event('input', { bubbles: true }); (_e$currentTarget = e.currentTarget) == null ? void 0 : _e$currentTarget.dispatchEvent(event); } } }; return { onClick: onClick, onChange: onChange, toNumber: toNumber, onKeyDown: onKeyDown, triggerChange: triggerChange, format: formatCurrency, decimalSeparator: decimalSeparator }; }; exports.useCurrency = useCurrency; exports.useCurrencyRegister = useCurrencyRegister; //# sourceMappingURL=react-hook-currency.cjs.development.js.map