react-native-mask-input
Version:
TextInput with mask for ReactNative on both iOS and Android. Includes obfuscation characters feature.
85 lines (74 loc) • 3.65 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var React = _interopRequireWildcard(require("react"));
var _formatWithMask = _interopRequireDefault(require("./formatWithMask"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (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; }
var _default = props => {
const {
value,
mask,
onChangeText,
placeholderFillCharacter = '_',
obfuscationCharacter,
showObfuscatedValue,
maskAutoComplete
} = props;
const maskArray = React.useMemo(() => typeof mask === 'function' ? mask(value) : mask, [mask, value]);
const formattedValueResult = React.useMemo(() => {
return (0, _formatWithMask.default)({
text: value || '',
mask,
obfuscationCharacter
});
}, [mask, obfuscationCharacter, value]);
const maskHasObfuscation = React.useMemo(() => maskArray && !!maskArray.find(maskItem => Array.isArray(maskItem)), [maskArray]);
const isValueObfuscated = React.useMemo(() => !!maskHasObfuscation && !!showObfuscatedValue, [maskHasObfuscation, showObfuscatedValue]);
const handleChangeText = React.useCallback(text => {
let textToFormat = text;
if (isValueObfuscated) {
textToFormat = formattedValueResult.masked || '';
if (textToFormat.length > text.length) {
textToFormat = textToFormat.slice(0, -1);
} else if (textToFormat.length < text.length) {
textToFormat = textToFormat + text[text.length - 1];
}
}
const result = (0, _formatWithMask.default)({
text: textToFormat,
mask,
obfuscationCharacter,
maskAutoComplete: maskAutoComplete && textToFormat.length > formattedValueResult.masked.length
});
onChangeText && onChangeText(result.masked, result.unmasked, result.obfuscated);
}, [isValueObfuscated, mask, obfuscationCharacter, onChangeText, formattedValueResult.masked, maskAutoComplete]);
const defaultPlaceholder = React.useMemo(() => {
if (maskArray) {
return maskArray.map(maskChar => {
if (typeof maskChar === 'string') {
return maskChar;
} else {
return placeholderFillCharacter;
}
}).join('');
} else {
return undefined;
}
}, [maskArray, placeholderFillCharacter]);
const inputValue = isValueObfuscated ? formattedValueResult.obfuscated : formattedValueResult.masked;
return {
onChangeText: handleChangeText,
value: inputValue,
selection: isValueObfuscated ? {
start: inputValue.length,
end: inputValue.length
} : undefined,
placeholder: defaultPlaceholder
};
};
exports.default = _default;
//# sourceMappingURL=useMaskedInputProps.js.map
;