react-native-paper-dates
Version:
Performant Date Picker for React Native Paper
58 lines (57 loc) • 2.04 kB
JavaScript
;
import { forwardRef, useEffect, useState } from 'react';
import { TextInput } from 'react-native-paper';
import { jsx as _jsx } from "react/jsx-runtime";
const splitCharacters = ['-', '/', '.', '年', ' '];
function detectCharacter(mask) {
const c = splitCharacters.find(ch => mask.includes(ch));
return c || '';
}
function escapeForRegExp(value) {
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
function TextInputWithMask({
inputButton,
onChangeText,
onChange,
value,
mask,
disabled,
...rest
}, ref) {
const [controlledValue, setControlledValue] = useState(value || '');
useEffect(() => {
setControlledValue(value || '');
}, [value]);
const onInnerChange = text => {
const splitCharacter = detectCharacter(mask);
const maskParts = mask.split(splitCharacter);
let trimmedText = text.trim();
const format = maskParts[0].toLowerCase() + splitCharacter + maskParts[1].toLowerCase() + splitCharacter + maskParts[2].toLowerCase();
const match = new RegExp(format.replace(/(\w+)\W(\w+)\W(\w+)/, '^\\s*($1)\\W*($2)?\\W*($3)?([0-9]*).*').replace(/m|d|y/g, '\\d'));
const replaceValue = format.match(/\W/);
const replace = `$1${splitCharacter}$2${splitCharacter}$3$4`.replace(new RegExp(escapeForRegExp(splitCharacter), 'g'), replaceValue ?? '');
const isBackSpace = controlledValue.length > trimmedText.length;
if (!isBackSpace) {
trimmedText = trimmedText.replace(/(^|\W)(?=\d\W)/g, '$10').replace(match, replace).replace(/(\W)+/g, '$1');
}
if (trimmedText.length === mask.length) {
onChangeText && onChangeText(trimmedText);
}
setControlledValue(trimmedText);
};
return /*#__PURE__*/_jsx(TextInput, {
ref: ref,
...rest,
disabled: disabled,
value: controlledValue,
onChangeText: onInnerChange,
onChange: e => {
onChange && onChange(e);
},
maxLength: 10,
right: inputButton
});
}
export default /*#__PURE__*/forwardRef(TextInputWithMask);
//# sourceMappingURL=TextInputMask.js.map