react18-input-otp
Version:
A fully customizable, one-time password (OTP) and phone number with separator input component for the web built with React.
307 lines (271 loc) • 9.05 kB
Markdown
# react18-input-otp
[](https://badge.fury.io/js/react18-input-otp) [](https://www.npmjs.com/package/react18-input-otp) [](https://www.npmjs.com/package/react18-input-otp)
<!-- ALL-CONTRIBUTORS-BADGE:END -->
A fully customizable, one-time password (OTP) and phone number with separator input component for the web built with React. Tested on Web, Android, and iOS. This package supports all react versions.

[Live Demo](https://ritikbanger.github.io/react18-input-otp)
[CodeSandbox](https://codesandbox.io/s/react18-input-otp-0nxzx7?file=/src/App.js)
## Features
- A fully customisable OTP input package with support of React 18 and Typescript.
- It works great on both react and ionic app. Works like a charm on mobile too.
- You can specify only numeric inputs with inputNum prop.
- Works perfectly with clipboard paste feature on web and mobile.
- The only OTP input package on npm that supports 'enter' key to submit.
- Zero OTP paste issues on Android.
- Easy paste on iOS chrome, read from SMS feature.
- Supports onSubmit optional prop. You do not even need a button to submit.
- You can use this package for phone number inputs too.
- You can use this package for passcode fields too with inputSecure prop.
- You can provide custom css as well as input props to the React18-input-otp.
- 0 dependencies.
- Minzipped size only 3.6 kb.
- No open issues.
- No security bugs.
## Installation
[](https://nodei.co/npm/react18-input-otp/)
#### To install the latest stable version:
```
npm install --save react18-input-otp
```
#### Basic usage:
##### As class component
```jsx
import React, { Component } from 'react';
import OtpInput from 'react18-input-otp';
export default class App extends Component {
state = { otp: '' };
handleChange = (otp) => this.setState({ otp });
render() {
return <OtpInput value={this.state.otp} onChange={this.handleChange} numInputs={6} separator={<span>-</span>} />;
}
}
```
##### As functional component with hooks
```jsx
import React, { useState } from 'react';
import OtpInput from 'react18-input-otp';
export default function ReactOtpInput() {
const [otp, setOtp] = useState('');
const handleChange = (enteredOtp) => {
setOtp(enteredOtp);
};
return <OtpInput value={otp} onChange={handleChange} numInputs={6} separator={<span>-</span>} />;
}
```
## API
<table>
<tr>
<th>Name<br/></th>
<th>Type</th>
<th>Required</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td>id</td>
<td>string</td>
<td>false</td>
<td>none</td>
<td>Provide unique id for your OTP input.</td>
</tr>
<tr>
<td>numInputs</td>
<td>number</td>
<td>true</td>
<td>4</td>
<td>Number of OTP inputs to be rendered.</td>
</tr>
<tr>
<td>onChange</td>
<td>function</td>
<td>true</td>
<td>console.log</td>
<td>Returns OTP code typed in inputs.</td>
</tr>
<tr>
<td>onSubmit</td>
<td>function</td>
<td>false</td>
<td>console.log</td>
<td>Returns OTP code on submit. This allows to submit the OTP on enter key too.</td>
</tr>
<tr>
<td>value</td>
<td>string / number</td>
<td>true</td>
<td>''</td>
<td>The value of the OTP passed into the component.</td>
</tr>
<tr>
<td>placeholder</td>
<td>string</td>
<td>false</td>
<td>none</td>
<td>Specify an expected value of each input. The length of this string should be equal to <code>numInputs</code>.</td>
</tr>
<tr>
<td>separator</td>
<td>component<br/></td>
<td>false</td>
<td>none</td>
<td>Provide a custom separator between inputs by passing a component. For instance, <code><span>-</span></code> would add <code>-</code> between each input.</td>
</tr>
<tr>
<td>separateAfter</td>
<td>number<br/></td>
<td>false</td>
<td>1</td>
<td>Provide the count to set the separater after every input. For instance, <code>3</code> would add <code>-</code> after every third input.</td>
</tr>
<tr>
<td>autoComplete</td>
<td>string<br/></td>
<td>false</td>
<td>off</td>
<td>Provide the autocomplete feature for the input. Now, supports <code>one-time-code</code> as autoComplete.</td>
</tr>
<tr>
<td>ariaLabelOverride</td>
<td>string<br/></td>
<td>false</td>
<td>none</td>
<td>Provide the custom arialabel for the input.</td>
</tr>
<tr>
<td>containerStyle</td>
<td>style (object) / className (string)</td>
<td>false</td>
<td>none</td>
<td>Style applied or class passed to container of inputs.</td>
</tr>
<tr>
<td>inputStyle</td>
<td>style (object) / className (string)</td>
<td>false</td>
<td>none</td>
<td>Style applied or class passed to each input.</td>
</tr>
<tr>
<td>focusStyle</td>
<td>style (object) / className (string)</td>
<td>false</td>
<td>none</td>
<td>Style applied or class passed to inputs on focus.</td>
</tr>
<tr>
<td>isDisabled</td>
<td>boolean</td>
<td>false</td>
<td>false</td>
<td>Disables all the inputs.</td>
</tr>
<tr>
<td>disabledStyle</td>
<td>style (object) / className (string)</td>
<td>false</td>
<td>none</td>
<td>Style applied or class passed to each input when disabled.</td>
</tr>
<tr>
<td>hasErrored</td>
<td>boolean</td>
<td>false</td>
<td>false</td>
<td>Indicates there is an error in the inputs.</td>
</tr>
<tr>
<td>errorStyle</td>
<td>style (object) / className (string)</td>
<td>false</td>
<td>none</td>
<td>Style applied or class passed to each input when errored.</td>
</tr>
<tr>
<td>isSuccessed</td>
<td>boolean</td>
<td>false</td>
<td>false</td>
<td>Indicates there is success with the inputs..</td>
</tr>
<tr>
<td>successStyle</td>
<td>style (object) / className (string)</td>
<td>false</td>
<td>none</td>
<td>Style applied or class passed to each input when success.</td>
</tr>
<tr>
<td>shouldAutoFocus</td>
<td>boolean</td>
<td>false</td>
<td>false</td>
<td>Auto focuses input on initial page load.</td>
</tr>
<tr>
<td>isInputNum</td>
<td>boolean</td>
<td>false</td>
<td>false</td>
<td>Restrict input to only numbers.</td>
</tr>
<tr>
<td>isInputSecure</td>
<td>boolean</td>
<td>false</td>
<td>false</td>
<td>Masks input characters.</td>
</tr>
<tr>
<td>data-cy</td>
<td>string</td>
<td>false</td>
<td>-</td>
<td>Test attribute passed to the inputs.</td>
</tr>
<tr>
<td>data-testid</td>
<td>string</td>
<td>false</td>
<td>-</td>
<td>Test attribute passed to the inputs.</td>
</tr>
<tr>
<td>custom-test-id</td>
<td>string</td>
<td>false</td>
<td>-</td>
<td>Custom test attribute passed to the inputs.</td>
</tr>
<tr>
<td>custom-test-attr</td>
<td>string</td>
<td>false</td>
<td>-</td>
<td>Custom test attribute passed to the inputs.</td>
</tr>
<tr>
<td>inputProps</td>
<td>InputHTMLAttributes | InputHTMLAttributes[]</td>
<td>false</td>
<td>-</td>
<td>Custom input props.</td>
</tr>
</table>
## Development
#### To run the development server:
```
npm run dev
```
## Checklist
[](https://github.com/ritikbanger/react18-input-otp/pulls) [](https://github.com/ritikbanger/react18-input-otp)
- [x] Add flowtypes
- [x] Add ESLint, Prettier for code quality
- [x] Add styling support for states including focus/disabled
- [ ] Write tests
## Contributing
[](https://github.com/ritikbanger/react18-input-otp/issues) [](https://github.com/ritikbanger/react18-input-otp/pulls)
Feel free to open [issues](https://github.com/ritikbanger/react18-input-otp/issues/new/choose) and [pull requests](https://github.com/ritikbanger/react18-input-otp/pulls)!
## License
[](https://github.com/ritikbanger/react18-input-otp/blob/master/LICENSE)
Special Thanks to [devfolioco](https://github.com/devfolioco/react-otp-input). This project is build on top of [react-otp-input](https://github.com/devfolioco/react-otp-input).
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!