An OTP Input Component based on Ant Design Component Library for React.
npm install antd-input-otpA custom input component for OTP (One Time Password) based on Ant Design Input for React.
- Ant Design >= 4.19.1
- React >= 16.8.0
> npm install antd-input-otp
> yarn add antd-input-otp
Simply import like other antd's components as usual and call it. You can use it uncontrolled with Form from Ant Design Form or use it controlled with React useState.
Keep in mind this component will return undefined or array of string.
``jsx
import { Button, Form } from 'antd';
import { InputOTP } from 'antd-input-otp'; // Don't forget to import this too!
const InputOTPPage = () => {
const [form] = Form.useForm();
const handleFinish = (values) => {
// Your logic
};
return (
$3
`jsx
import { useState } from 'react';
import { Button } from 'antd';
import { InputOTP } from 'antd-input-otp'; // Don't forget to import this too!const InputOTPPage = () => {
const [value, setValue] = useState([]); // Since the value will be array of string, the default value of state is empty array.
const handleFinish = (otp) => {
const payload = otp || value; // Since useState work asynchronously, we shall add the field value from the autoSubmit.
// Your logic with state
};
return (
);
};
`Props ๐ฅ
Keep in mind, the props will be extended to antd
InputProps, which means properties that are not listed below can be seen on Ant Design Input.| Property | Type | Default Value | Description |
| :----------------- | :---------------------------------------------------------------------------------------------------------------------- | :-----------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
autoFocus | boolean | false | Autofocus for the first field of OTP. If you want to make the second or third or even the last field autofocused, use inputRef. |autoSubmit | FormInstance \| (value: string[]) => void \| null | null | Autosubmit when the value is fully filled. |disabled | boolean | false | |inputClassName | string | | Classes for styling input field. |inputRef | Mutable Reference Object (InputRef[], null[], null) | null | Reference for the input fields. Inside of the current should be array of InputRef from antd. |inputRegex | RegExp or string when inputType set as custom.never | | If you choose custom as inputType, inputRegex will be mandatory.inputStyle | CSSProperties | | Inline style input field. |inputType | all \| alphabet \| alphabet-numeric \| alphabet-symbol \| numeric \| numeric-symbol \| symbol \| custom | all | custom validation will be requiring your own regex on inputType.all as the value will invalidate the field and every field can be filled with anything. |length | number | 6 | Determine the total of your fields.2 and the maximum value is 16. The length will stay on the limit if you fill it outside the limit. |isPreservedFocus | boolean | false | Determine whether the input is still focused or not when every field is filled. |onChange | (value: string[]) => void | | |placeholder | string | | Placeholder for each field. When the value is only one character It will apply to all fields with the same value."x", all fields will have x as placeholder."x_x_x_". |value | string[] \| null | | |wrapperClassName | string | | Classes for styling input wrapper. |wrapperStyle | CSSProperties | | Inline style input wrapper. |A: You see, React useState works asynchronously, so when autoSubmit is triggered, the setState is not running yet. The solution so far is by using the value from the argument of the functions. You can see this in the example above.
A: To be honest, I am not quite sure about this, but the solution for now is to add this line of code inside your .env file.
```
GENERATE_SOURCEMAP=false
A: YES! But you should update it to v1.1.0 first. Keep in mind, the value that you copy should be suitable with your inputType, for example if you have 030212 in your clipboard, and your inputType is numeric, it will work. But it will be a different story when your value is A023@c!, it won't work.
A: This component will return an array of strings if erased or already filled, or undefined if this component remains untouched.
A: Ofcourse, the best part is you don't need to setup anything. Just write and go!
A: You bet! Use it like other input with onChange and value.
A: Interesting, first of all, add a class on your InputOTP's Form.Item. then add text-align: center on .ant-form-item .ant-form-item-explain-error.
If you are using antd v5, be sure to wrap .ant-form-item with :where(), so it will become like this..
`scss``
.your-classname:where(.ant-form-item) .ant-form-item-explain-error {
text-align: center;
}
Having another question? Ask me on the github issue!