UNPKG

react-native-advanced-input-mask

Version:

Text input mask for React Native on iOS, Android and web. Synchronous and easy formatting without hustle

348 lines (252 loc) 11.3 kB
# React Native Advanced Input Mask <div> <img align="right" src="./gifs/demo.gif?raw=true" width="30%"> </div> ### Overview `react-native-advanced-input-mask` is a React Native package that provides flexible input masking functionality for mobile applications. It allows you to format input fields dynamically as users type, ensuring that data is entered in a consistent and valid format. This package wraps the `input-mask-android` library for Android and its equivalent for iOS, offering a cross-platform solution. Input masking can be used to format text fields for phone numbers, dates, credit card numbers, social security numbers, and other input types that require specific formatting. ### Features - ✨ Ensures smooth, flicker-free text formatting in a real time. - 🧬 Supports multiple mask types and formats. - ⚡ Instantly applies the correct format as users type, without delays. - 🚀 Cross-platform support for iOS, Android and web. - 🛠️ Easy integration with existing React Native components. Install the package using npm or yarn: ```bash npm install react-native-advanced-input-mask # or yarn add react-native-advanced-input-mask ``` ## Usage Import `react-native-advanced-input-mask` in your component to apply masking to input fields. ### Basic Example ```typescript import React, { useState, useCallback } from "react"; import { TextInput, View } from "react-native"; import { MaskedTextInput } from "react-native-advanced-input-mask"; const ExampleComponent = () => { const [phoneNumber, setPhoneNumber] = useState(""); const onChangeText = useCallback((formatted, extracted) => { setPhoneNumber(formatted); }, []); return ( <MaskedTextInput autocomplete={false} mask="+1 ([000]) [000]-[0000]" value={phoneNumber} onChangeText={onChangeText} keyboardType="numeric" /> ); }; export default ExampleComponent; ``` ### UK IBAN: ```typescript import React, { useState, useCallback } from "react"; import { TextInput, View } from "react-native"; import { MaskedTextInput } from "react-native-advanced-input-mask"; const ExampleComponent = () => { const [IBAN, setIBAN] = useState(""); const onChangeText = useCallback((formatted, extracted) => { setIBAN(formatted); }, []); return ( <MaskedTextInput autocomplete={false} mask="GB[00] [____] [0000] [0000] [0000] [00]" value={IBAN} onChangeText={onChangeText} /> ); }; export default ExampleComponent; ``` ### Dates: ```typescript import React, { useState, useCallback } from "react"; import { TextInput, View } from "react-native"; import { MaskedTextInput } from "react-native-advanced-input-mask"; const ExampleComponent = () => { const [date, setDate] = useState(""); const onChangeText = useCallback((formatted, extracted) => { setDate(formatted); }, []); return ( <MaskedTextInput autocomplete={false} mask="[00]{.}[00]{.}[9900]" value={date} onChangeText={onChangeText} /> ); }; export default ExampleComponent; ``` ### Detailed Mask Explanation The mask pattern defines how user input is processed and displayed. The characters below are used for defining patterns: - `[0]`: mandatory digit. For instance, `[000]` will allow entering three digits: `123`. - `[9]`: optional digit.For instance, `[00099]` will allow entering up to five digits, but at least three. - `[A]`: mandatory letter. For instance, `[AAA]` will allow entering three letters: `ABC`. - `[a]`: optional letter. `[АААааа]` will allow entering from three to six letters. - `[_]`: mandatory symbol (digit or letter). - `[-]`: optional symbol (digit or letter). - `[…]`: ellipsis. Allows to enter endless count of symbols. ## Advanced Usage For applications requiring conditional or more complex formatting, this package provides additional configuration options. ### MaskedTextInput Component - Props | Prop | Type | Description | | ----------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- | | `mask` | `string` | The mask format to be applied to the text input, defining the pattern for formatting. Example: `"[0000] [0000] [0000] [0000]"`. | | `customNotations` | `Notation[]` | Array of custom notations for the mask format. Each notation object includes: `character`, `characterSet`, and `isOptional`. | | `allowedKeys` | `string` | A string specifying the characters that are permitted for input. | | `validationRegex` | `regex string` | A validation regex that runs before applying the mask. | | `onChangeText` | `(formatted: string, extracted: string) => void` | Callback function triggered on text change. Receives `formattedValue` (with mask) and `extractedValue` (raw input). | | `onTailPlaceholderChange` | `(tailPlaceholder: string) => void` | Callback function called when the tail placeholder changes, receiving the updated `tailPlaceholder` value. | | `affinityFormat` | `string[]` | Array of strings for affinity format, used to determine the best mask format based on the input. | | `autocomplete` | `boolean` | Enables or disables autocomplete for the text input. Default is `true` | | `autoSkip` | `boolean` | Automatically skips to the next input field when the current one is filled. Default is `false`. | | `isRTL` | `boolean` | Enables right-to-left (RTL) text direction for the text input. Default is `false`. | | `affinityCalculationStrategy` | `AFFINITY_CALCULATION_STRATEGY` | Defines the strategy for affinity calculation, determining how the best mask format is selected based on input. | | `customTransformation` | `CustomTransformation` | Custom transformation applied to the text input to define how the input text should be transformed. | | `defaultValue` | `string` | The default value for the input field. | | `value` | `string` | Current value of the input field, allowing controlled input behavior. | | `allowSuggestions` | `boolean` (iOS only) | Enables or disables input suggestions on iOS. Default is `false`. | | `autocompleteOnFocus` | `boolean` | Enables autocomplete when the text input is focused. | | `placeholder` | `string` | Placeholder text displayed in the input. | | `keyboardType` | `string` | Sets the keyboard type. Useful for numeric masks with `keyboardType="numeric"`. | | `autoFocus` | `boolean` | If `true`, focuses the input on component load. Default is `false`. | ## Cookbook Cookbook is a community-driven handbook with complete solutions for common problems. Text formatting problems, of course. Feel free to suggest your own recipes or correct the existing ones. ## Chapters - [Credit cards](#cards) - [Amount inputs](#amount) - [Dates](#date) - [IBAN, International Bank Account Number](#iban) - [Phone numbers](#phone) <a name="cards" /> ### Credit cards MM/YY: `[00]{/}[00]` CVV: `[000]` #### American Express ``` [0000] [000000] [00000] 3[000] [000000] [00000] ``` #### Diners Club International ``` [0000] [000000] [0000] 3[000] [000000] [0000] ``` #### Discover ``` [0000] [0000] [0000] [0000] 6[000] [0000] [0000] [0000] ``` #### MasterCard ``` [0000] [0000] [0000] [0000] 5[000] [0000] [0000] [0000] ``` #### Visa ``` [0000] [0000] [0000] [0000] 4[000] [0000] [0000] [0000] ``` <a name="amount" /> ### Amount inputs ``` [0999990].[09] ``` > [!NOTE] > To forbid entering not allowed characters, use `allowedKeys` prop. For example `allowedKeys="0123456789,."`. <a name="date" /> ### Dates Affine formats: ``` [00]{/}[00]{/}[00] [00]{/}[00]{/}[0000] ``` ``` [00]{.}[00]{.}[00] [00]{.}[00]{.}[0000] ``` <a name="iban" /> ### IBAN, International Bank Account Number #### Belgium ``` BE[00] [0000] [0000] [0000] ``` #### France ``` FR[00] [0000] [0000] [0000] [0000] [0000] [000] ``` #### Germany ``` DE[00] [0000] [0000] [0000] [0000] [00] ``` #### Greece ``` GR[00] [0000] [0000] [0000] [0000] [0000] [000] ``` #### Romania ``` RO[00] [____] [0000] [0000] [0000] [0000] ``` #### Saudi Arabia ``` SA[00] [0000] [0000] [0000] [0000] [0000] ``` #### Spain ``` ES[00] [0000] [0000] [0000] [0000] [0000] ``` #### Switzerland ``` CH[00] [0000] [0000] [0000] [0000] [0] ``` #### United Kingdom ``` GB[00] [____] [0000] [0000] [0000] [00] ``` <a name="phone" /> ### Phone numbers ``` 8 ([000]) [000]-[00]-[00] ``` ## Custom notations ```tsx import React, { useState, useCallback } from "react"; import { TextInput, View } from "react-native"; import { MaskedTextInput } from "react-native-advanced-input-mask"; const alphaNumericChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; const charAlphaNumerics = [ { character: "$", characterSet: alphaNumericChars, isOptional: false, }, ]; const ExampleComponent = () => { const [text, setText] = useState(""); const onChangeText = useCallback((formatted, extracted) => { setText(formatted); }, []); return ( <MaskedTextInput mask="[$$$$$$$$$$$]" value={text} onChangeText={onChangeText} /> ); }; ``` ## Contributing To contribute to this package, clone the repository and install dependencies: ```bash git clone https://github.com/IvanIhnatsiuk/react-native-advanced-input-mask cd react-native-advanced-input-mask && yarn install ```