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
JavaScript
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
;