react-pin-input-hook
React hook for entering a PIN code.
Installation
// with npm
npm install --save react-pin-input-hook
// with yarn
yarn add react-pin-input-hook
Usage example
Uncontrolled
import * as React from 'react'
import { usePinInput } from 'react-pin-input-hook'
function Component() {
const { fields } = usePinInput({
onComplete: (value) => {
// Here you can make asynchronous requests to your API for verification.
console.log(value)
},
})
return (
<div className='pin-input'>
{fields.map((propsField, index) => (
<input key={index} className='pin-input__field' {...propsField} />
))}
</div>
)
}
Controlled
import * as React from 'react'
import { usePinInput } from 'react-pin-input-hook'
function Component() {
const [values, setValues] = React.useState(Array(6).fill(''))
const { fields } = usePinInput({
values,
onChange: (values) => {
setValues(values)
},
})
return (
<div className='pin-input'>
{fields.map((propsField, index) => (
<input key={index} className='pin-input__field' {...propsField} />
))}
</div>
)
}
Options
Prop | Type | Default | Description |
---|---|---|---|
values | string[] | – | Field values. If no values are passed, the default value defined in defaultValues is used. |
onChange | (values: string[]) => void | – | The function is called every time the value changes. |
onComplete | (value: string) => void | – | The function is called when all fields are filled in. |
actionRef | React.Ref<PinInputActions> | – | A reference to imperative actions. |
autoFocus | boolean | false | Automatic focus setting at the first mount, is set to the first field. |
defaultValues | string[] | [”,”,”,”,”,”] | In the case when the component is unmanaged, default values are set, where the number of values in the array is equal to the number of fields. |
type | ‘numeric’ or ‘alphanumeric’ | ‘numeric’ | Changes the type of keyboard display on mobile devices. |
otp | boolean | false | If true , then the attribute autocomplete=“one-time-code” is added, otherwise autocomplete=“off” . |
placeholder | string | ‘○’ | Placeholder for the input element. |
disabled | boolean | false | If true , the transmission of event handlers onChange , onBlur , onFocus and onKeyDown in the parameters of each field is prevented. |
mask | boolean | false | If true , then the attribute type="password" is set, otherwise type="text" . |
error | boolean | false | If true , then the focus behavior on the fields changes. |
Return
Prop | Type | Default | Description |
---|---|---|---|
fields | PinInputFieldProps[] | – | An array of objects with attributes. |
isFocused | boolean | – | Whether the focus was set on any field. |
clear | (options?: { focus?: boolean }) => void | { focus: false } | Sets the initial values of the fields. Removes focus by default. The parameter can be passed { focus: true } to set the focus on the first field. |
PinInputFieldProps
Prop | Type | Descriptions |
---|---|---|
ref | React.RefCallback | Returns a callback function to register the field. |
value | string | Returns the value of the field. |
disabled | boolean | Returns the value passed by the disabled parameter. |
autoComplete | ‘one-time-code’ or ‘off’ | Returns either one-time-code if the parameter otp: true was passed, otherwise off . |
inputMode | ‘text’ or ‘numeric’ | Returns either text if the parameter type: 'alphanumeric' was passed, otherwise numeric . |
type | ‘text’ or ‘password’ | Returns either password if the mask: true parameter was passed, or text . |
placeholder | string | Returns the value passed by the placeholder parameter if there are no focused fields. |
onBlur | (event: React.FocusEvent) => void | Returns the handler for the focus loss event if disabled: false . |
onFocus | (event: React.FocusEvent) => void | Returns the handler for the focus appearance event if disabled: false . |
onChange | (event: React.ChangeEvent) => void | Returns a handler for the field change event if disabled: false . |
onKeyDown | (event: React.ChangeEvent) => void | Returns a handler for the keystroke event if disabled: false . |
PinInputActions
Name | Type | Description |
---|---|---|
blur | () => void | Imperative function call to lose focus. |
focus | (index?: number) => void | Imperative function call to set focus on the first empty field. In the case when error: true . the focus is set to the first empty field. The argument takes an optional parameter in the form of a number (ordinal index), which will set the focus on a specific field. |
Example
import * as React from 'react'
import { usePinInput, PinInputActions } from 'react-pin-input-hook'
function Component() {
const [values, setValues] = React.useState(['', '', '', '', '', ''])
const [error, setError] = React.useState(false)
const actionRef = React.useRef<PinInputActions>(null)
const { fields } = usePinInput({
values,
onChange: setValues,
error,
actionRef,
})
const onSubmit = () => {
// Check if there is at least one empty field. If there is, the input is considered empty.
if (values.includes('')) {
// Setting the error.
setError(true)
// We set the focus on the first empty field if `error: true` was passed as a parameter in `options`.
actionRef.current?.focus()
}
}
return (
<form>
<div className='pin-input'>
{fields.map((propsField, index) => (
<input key={index} className='pin-input__field' {...propsField} />
))}
</div>
<button onClick={onSubmit}>Submit</button>
</form>
)
}