react-native-mask-input
Version:
TextInput with mask for ReactNative on both iOS and Android. Includes obfuscation characters feature.
234 lines (205 loc) • 3.62 kB
text/typescript
import createNumberMask from './createNumberMask';
import type { Mask, MaskArray } from './formatWithMask.types';
const BRL_CAR_PLATE = [/[a-zA-Z]/, /[a-zA-Z]/, /[a-zA-Z]/, '-', /\d/, /\w/, /\d/, /\d/];
const BRL_CNPJ = [
/\d/,
/\d/,
'.',
/\d/,
/\d/,
/\d/,
'.',
/\d/,
/\d/,
/\d/,
'/',
/\d/,
/\d/,
/\d/,
/\d/,
'-',
/\d/,
/\d/,
];
const BRL_CPF = [
/\d/,
/\d/,
/\d/,
'.',
/\d/,
/\d/,
/\d/,
'.',
/\d/,
/\d/,
/\d/,
'-',
/\d/,
/\d/,
];
const BRL_CPF_CNPJ = (text?: string) => {
const rawValue = text?.replace(/\D+/g, '') || '';
return rawValue.length <= 11 ? BRL_CPF : BRL_CNPJ;
};
const BRL_CURRENCY = createNumberMask({
prefix: ['R', '$', ' '],
separator: ',',
delimiter: '.',
precision: 2,
});
const USA_PHONE = [
`(`,
/[2-9]/,
/\d/,
/\d/,
')',
' ',
/[2-9]/,
/\d/,
/\d/,
'-',
/\d/,
/\d/,
/\d/,
/\d/,
];
const BRL_PHONE = [
'(',
/\d/,
/\d/,
')',
' ',
/\d/,
/\d/,
/\d/,
/\d/,
/\d/,
'-',
/\d/,
/\d/,
/\d/,
/\d/,
];
const CREDIT_CARD = [
/\d/,
/\d/,
/\d/,
/\d/,
' ',
[/\d/],
[/\d/],
[/\d/],
[/\d/],
' ',
[/\d/],
[/\d/],
[/\d/],
[/\d/],
' ',
/\d/,
/\d/,
/\d/,
/\d/,
] as MaskArray;
const DATE_DDMMYYYY: Mask = (text = '') => {
const cleanText = text.replace(/\D+/g, '');
let secondDigitDayMask = /\d/;
if (cleanText.charAt(0) === '0') {
secondDigitDayMask = /[1-9]/;
}
if (cleanText.charAt(0) === '3') {
secondDigitDayMask = /[01]/;
}
let secondDigitMonthMask = /\d/;
if (cleanText.charAt(2) === '0') {
secondDigitMonthMask = /[1-9]/;
}
if (cleanText.charAt(2) === '1') {
secondDigitMonthMask = /[012]/;
}
return [
/[0-3]/,
secondDigitDayMask,
'/',
/[0-1]/,
secondDigitMonthMask,
'/',
/\d/,
/\d/,
/\d/,
/\d/,
];
};
const DATE_MMDDYYYY: Mask = (text = '') => {
const cleanText = text.replace(/\D+/g, '');
let secondDigitMonthMask = /\d/;
if (cleanText.charAt(0) === '0') {
secondDigitMonthMask = /[1-9]/;
}
if (cleanText.charAt(0) === '1') {
secondDigitMonthMask = /[012]/;
}
let secondDigitDayMask = /\d/;
if (cleanText.charAt(2) === '0') {
secondDigitDayMask = /[1-9]/;
}
if (cleanText.charAt(2) === '3') {
secondDigitDayMask = /[01]/;
}
return [
/[0-1]/,
secondDigitMonthMask,
'/',
/[0-3]/,
secondDigitDayMask,
'/',
/\d/,
/\d/,
/\d/,
/\d/,
];
};
const DATE_YYYYMMDD: Mask = (text = '') => {
const cleanText = text.replace(/\D+/g, '');
let secondDigitMonthMask = /\d/;
if (cleanText.charAt(4) === '0') {
secondDigitMonthMask = /[1-9]/;
}
if (cleanText.charAt(4) === '1') {
secondDigitMonthMask = /[012]/;
}
let secondDigitDayMask = /\d/;
if (cleanText.charAt(6) === '0') {
secondDigitDayMask = /[1-9]/;
}
if (cleanText.charAt(6) === '3') {
secondDigitDayMask = /[01]/;
}
return [
/\d/,
/\d/,
/\d/,
/\d/,
'/',
/[0-1]/,
secondDigitMonthMask,
'/',
/[0-3]/,
secondDigitDayMask,
];
};
const ZIP_CODE = [/\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/];
export default {
BRL_CAR_PLATE,
BRL_CNPJ,
BRL_CPF,
BRL_CPF_CNPJ,
BRL_CURRENCY,
BRL_PHONE,
USA_PHONE,
CREDIT_CARD,
DATE_DDMMYYYY,
DATE_MMDDYYYY,
DATE_YYYYMMDD,
ZIP_CODE,
};