Backpack UI
Recipes
React Hook Form

React hook form recipe









+213


Code


_132
import React, { useEffect, useState } from 'react';
_132
import { FormInput } from '@ef-global/backpack/FormInput';
_132
import { Form } from '@ef-global/backpack/Form';
_132
import { useForm } from 'react-hook-form';
_132
import { Button } from '@ef-global/backpack/Button';
_132
import axios from 'axios';
_132
import { FormGroup } from '@ef-global/backpack/FormGroup';
_132
import { FormSwitch } from '@ef-global/backpack/FormSwitch';
_132
import {
_132
FormRadio,
_132
FormRadioGroup,
_132
FormRadioTile,
_132
} from '@ef-global/backpack/FormRadio';
_132
import {FormSelect, Option} from "@ef-global/backpack/FormSelect";
_132
import {FormPhoneInput} from "@ef-global/backpack/FormPhoneInput";
_132
_132
export const ReactHookForm = () => {
_132
const {register, handleSubmit, setValue, watch, control, formState, formState: {errors}} = useForm({mode: 'onChange'});
_132
const [result, setResult] = useState(null)
_132
const onSubmit = async data => {
_132
await axios.post('/api/form-tester', data).then(res => setResult(JSON.stringify(res.data, null, 2)))
_132
};
_132
_132
useEffect(() => {
_132
register('radios', { required: true });
_132
register('tiles', { required: true });
_132
}, []);
_132
_132
return (
_132
<>
_132
<Form onSubmit={handleSubmit(onSubmit)} id={`react-hook-form`}>
_132
<FormGroup>
_132
<FormInput
_132
type='text'
_132
placeholder='Input text'
_132
{...register('firstName', { required: true })}
_132
/>
_132
</FormGroup>
_132
<br />
_132
<FormSwitch
_132
{...register('switch', { required: true, pattern: /true/ })}
_132
value={false}
_132
onCheckedChange={(checked) => {
_132
setValue('switch', checked);
_132
}}
_132
valid={!errors.switch}
_132
>
_132
Test switch
_132
</FormSwitch>
_132
<br />
_132
_132
<FormRadioGroup
_132
onValueChange={(v) => {
_132
setValue('radios', v, {
_132
shouldValidate: true,
_132
});
_132
}}
_132
valid={!errors.radios}
_132
stack
_132
tile
_132
>
_132
<FormRadio value={'radio0'} valid={!errors.radios}>
_132
radio 0
_132
</FormRadio>
_132
<FormRadio value={'radio1'} valid={!errors.radios}>
_132
radio 1
_132
</FormRadio>
_132
<FormRadio value={'radio2'} valid={!errors.radios}>
_132
radio 2
_132
</FormRadio>
_132
<FormRadio value={'radio3'} valid={!errors.radios}>
_132
radio 3
_132
</FormRadio>
_132
</FormRadioGroup>
_132
<br />
_132
<FormRadioGroup
_132
onValueChange={(v) => {
_132
setValue('tiles', v, {
_132
shouldValidate: true,
_132
});
_132
}}
_132
valid={!errors.tiles}
_132
stack
_132
tile
_132
>
_132
<FormRadioTile value={'tile0'} valid={!errors.tiles}>
_132
tile 0
_132
</FormRadioTile>
_132
<FormRadioTile value={'tile1'} valid={!errors.tiles}>
_132
tile 1
_132
</FormRadioTile>
_132
<FormRadioTile value={'tile2'} valid={!errors.tiles}>
_132
tile 2
_132
</FormRadioTile>
_132
<FormRadioTile value={'tile3'} valid={!errors.tiles}>
_132
tile 3
_132
</FormRadioTile>
_132
</FormRadioGroup>
_132
<br />
_132
{/* @ts-ignore */}
_132
<FormSelect
_132
placeholder={'Select'}
_132
valid={!errors.select}
_132
onValueChange={(value) => setValue('select', value)}
_132
{...register('select', {required: true})}
_132
>
_132
<Option value={'1'}>1</Option>
_132
<Option value={'2'}>2</Option>
_132
<Option value={'3'}>3</Option>
_132
<Option value={'4'}>4</Option>
_132
</FormSelect>
_132
<br/>
_132
<br/>
_132
<FormPhoneInput
_132
floatingLabel={'Phone'}
_132
valid={!errors.phone}
_132
onValueChange={value => setValue('phone', value)}
_132
{...register('phone')}
_132
/>
_132
<br/>
_132
<br/>
_132
<Button as={'button'} variant={'primary'} type={`submit`}>Submit</Button>
_132
</Form>
_132
{result && (
_132
<>
_132
<h5 style={{ marginBottom: 0 }}>Result:</h5>
_132
<pre style={{ marginTop: 10 }}>{result}</pre>
_132
</>
_132
)}
_132
</>
_132
);
_132
};