Backpack UI
Recipes
Formik

Formik recipe









+213


Code


_153
import { FormikErrors, useFormik } from 'formik';
_153
import { Form } from '@ef-global/backpack/Form';
_153
import { FormInput } from '@ef-global/backpack/FormInput';
_153
import { Button } from '@ef-global/backpack/Button';
_153
import { FormSwitch } from '@ef-global/backpack/FormSwitch';
_153
import axios from 'axios';
_153
import React, { useState } from 'react';
_153
import {
_153
FormRadio,
_153
FormRadioGroup,
_153
FormRadioTile,
_153
} from '@ef-global/backpack/FormRadio';
_153
import { FormSelect, Option } from '@ef-global/backpack/FormSelect';
_153
import { FormPhoneInput } from '@ef-global/backpack/FormPhoneInput';
_153
_153
interface FormFields {
_153
firstName: string;
_153
switch: 'off' | 'on';
_153
radios: '' | 'radio1' | 'radio2' | 'radio3';
_153
tiles: '' | 'tile1' | 'tile2' | 'tile3';
_153
select: string;
_153
phone: string;
_153
}
_153
_153
export const FormikRecipe = () => {
_153
const [result, setResult] = useState(null);
_153
_153
const formik = useFormik({
_153
initialValues: {
_153
firstName: '',
_153
switch: 'off',
_153
radios: '',
_153
tiles: '',
_153
select: '',
_153
phone: '',
_153
},
_153
validate: (values: FormFields) => {
_153
let errors: FormikErrors<FormFields> = {};
_153
if (!values.firstName) {
_153
errors.firstName = 'Required';
_153
}
_153
_153
if (!values.switch || values.switch === 'off') {
_153
errors.switch = 'Required';
_153
}
_153
_153
if (!values.radios) {
_153
errors.radios = 'Required';
_153
}
_153
_153
if (!values.tiles) {
_153
errors.tiles = 'Required';
_153
}
_153
_153
if (!values.select) {
_153
errors.select = 'Required';
_153
}
_153
_153
if (!values.phone) {
_153
errors.phone = 'Required';
_153
}
_153
_153
return errors;
_153
},
_153
onSubmit: async (values) => {
_153
await axios
_153
.post('/api/form-tester', values)
_153
.then((res) => setResult(JSON.stringify(res.data, null, 2)));
_153
},
_153
});
_153
_153
return (
_153
<>
_153
<Form onSubmit={formik.handleSubmit}>
_153
<FormInput
_153
type={'text'}
_153
name={'firstName'}
_153
placeholder={'First name'}
_153
onChange={formik.handleChange}
_153
value={formik.values.firstName}
_153
valid={!Boolean(formik.errors.firstName)}
_153
/>
_153
<br />
_153
<FormSwitch
_153
name={'switch'}
_153
checked={formik.values.switch === 'on'}
_153
onCheckedChange={async (checked) =>
_153
formik.setFieldValue('switch', checked ? 'on' : 'off')
_153
}
_153
value={formik.values.switch}
_153
valid={!Boolean(formik.errors.switch)}
_153
/>
_153
<br />
_153
<FormRadioGroup
_153
name={'radios'}
_153
onValueChange={async (value) => formik.setFieldValue('radios', value)}
_153
>
_153
<FormRadio value={'radio1'}>radio 1</FormRadio>
_153
<FormRadio value={'radio2'}>radio 2</FormRadio>
_153
<FormRadio value={'radio3'}>radio 3</FormRadio>
_153
</FormRadioGroup>
_153
<br />
_153
<FormRadioGroup
_153
name={'tiles'}
_153
onValueChange={async (value) => formik.setFieldValue('tiles', value)}
_153
tile
_153
stack
_153
>
_153
<FormRadioTile value={'tile1'} valid={!Boolean(formik.errors.tiles)}>
_153
tile 1
_153
</FormRadioTile>
_153
<FormRadioTile value={'tile2'} valid={!Boolean(formik.errors.tiles)}>
_153
tile 2
_153
</FormRadioTile>
_153
<FormRadioTile value={'tile3'} valid={!Boolean(formik.errors.tiles)}>
_153
tile 3
_153
</FormRadioTile>
_153
</FormRadioGroup>
_153
<br />
_153
<FormSelect
_153
placeholder={'Select'}
_153
name={'select'}
_153
valid={!Boolean(formik.errors.select)}
_153
onValueChange={async (value) => formik.setFieldValue('select', value)}
_153
>
_153
<Option value={'1'}>1</Option>
_153
<Option value={'2'}>2</Option>
_153
<Option value={'3'}>3</Option>
_153
<Option value={'4'}>4</Option>
_153
</FormSelect>
_153
<br />
_153
<br />
_153
<FormPhoneInput
_153
name={'phone'}
_153
floatingLabel={'Phone'}
_153
valid={!Boolean(formik.errors.phone)}
_153
onValueChange={async (value) => formik.setFieldValue('phone', value)}
_153
/>
_153
<br />
_153
<br />
_153
<Button as={'button'} type={'submit'} variant={'primary'}>
_153
Submit
_153
</Button>
_153
</Form>
_153
{result && (
_153
<>
_153
<h5 style={{ marginBottom: 0 }}>Result:</h5>
_153
<pre style={{ marginTop: 10 }}>{result}</pre>
_153
</>
_153
)}
_153
</>
_153
);
_153
};