UNPKG

react-native-mask-input

Version:

TextInput with mask for ReactNative on both iOS and Android. Includes obfuscation characters feature.

68 lines (65 loc) 2.4 kB
import * as React from 'react'; import formatWithMask from './formatWithMask'; export 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 formatWithMask({ 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 = formatWithMask({ 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 }; }); //# sourceMappingURL=useMaskedInputProps.js.map