Complete additional info logic

This commit is contained in:
Hazem Krimi
2021-04-29 19:12:18 +01:00
parent 1db8dc2430
commit ae6c8164f7
+125 -23
View File
@@ -1,8 +1,81 @@
import { Box, Button, Input, Select, Text } from '../../../components'; import * as Yup from 'yup';
import { useFormik } from 'formik';
import { useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useMutation, useReactiveVar } from '@apollo/client';
import { Box, Button, Input, Select, Text, Alert } from '../../../components';
import { theme } from '../../../themes'; import { theme } from '../../../themes';
import { Wrapper } from './styles'; import { Wrapper } from './styles';
import {
UpdateUserInfoMutation,
UpdateUserInfoMutationVariables,
} from '../../../graphql/types';
import { UPDATE_USER_INFO } from '../../../graphql/auth.api';
import { userVar } from '../../../graphql/state';
const AdditionalInfo = () => { const AdditionalInfo = () => {
const history = useHistory();
const [error, setError] = useState<string>('');
const currentUser = useReactiveVar(userVar);
const [updateUserInfo, { loading }] = useMutation<
UpdateUserInfoMutation,
UpdateUserInfoMutationVariables
>(UPDATE_USER_INFO, {
onCompleted({ updateUserInfo: user }) {
userVar(user);
history.push('/');
},
onError({ graphQLErrors }) {
setError(graphQLErrors[0]?.extensions?.info);
setTimeout(() => setError(''), 3000);
},
});
const form = useFormik({
initialValues: {
firstName: '',
lastName: '',
prefix: '',
number: '',
place: '',
city: '',
zip: '',
country: '',
},
validationSchema: Yup.object().shape({
firstName: Yup.string().required('First Name is required'),
lastName: Yup.string().required('Last Name is required'),
prefix: Yup.string().required('Prefix is required'),
number: Yup.number().required('Number is required'),
place: Yup.string().required('Address is required'),
city: Yup.string().required('City is required'),
country: Yup.string().required('Country is required'),
}),
onSubmit: (
{ firstName, lastName, prefix, number, place, city, country, zip },
{ resetForm }
) => {
try {
updateUserInfo({
variables: {
id: currentUser?.id!,
email: currentUser?.email!,
firstName,
lastName,
phone: { prefix, number },
address: { place, city, country, zip },
},
});
} catch (err) {
setError(err.message);
setTimeout(() => setError(''), 3000);
} finally {
resetForm();
}
},
});
return ( return (
<Wrapper> <Wrapper>
<Box <Box
@@ -21,6 +94,7 @@ const AdditionalInfo = () => {
Tell us more about yourself Tell us more about yourself
</Text> </Text>
</Box> </Box>
<form onSubmit={form.handleSubmit}>
<Box <Box
display='grid' display='grid'
gridTemplateColumns='auto' gridTemplateColumns='auto'
@@ -30,14 +104,20 @@ const AdditionalInfo = () => {
<Input <Input
name='firstName' name='firstName'
label='First Name' label='First Name'
value='' value={form.values.firstName}
onChange={() => {}} onChange={form.handleChange}
onBlur={form.handleBlur}
error={!!form.errors.firstName}
errorMessage={form.errors.firstName}
/> />
<Input <Input
name='lastName' name='lastName'
label='Last Name' label='Last Name'
value='' value={form.values.lastName}
onChange={() => {}} onChange={form.handleChange}
onBlur={form.handleBlur}
error={!!form.errors.lastName}
errorMessage={form.errors.lastName}
/> />
<Box <Box
display='grid' display='grid'
@@ -45,39 +125,57 @@ const AdditionalInfo = () => {
columnGap='10px' columnGap='10px'
> >
<Select <Select
name='coutryConde' name='prefix'
label='Country Code' label='Country Code'
options={[{ value: '+216', label: '+216' }]} options={[
onChange={() => {}} { value: '+216', label: '+216' },
value='' { value: '+213', label: '+213' },
]}
onChange={form.handleChange}
onBlur={form.handleBlur}
value={form.values.prefix}
/> />
<Input <Input
name='phone' name='number'
type='tel' type='tel'
label='Phone' label='Phone'
value='' onChange={form.handleChange}
onChange={() => {}} onBlur={form.handleBlur}
value={form.values.number}
/> />
</Box> </Box>
<Input <Input
name='address' name='place'
label='Address' label='Address'
value='' onChange={form.handleChange}
onChange={() => {}} onBlur={form.handleBlur}
value={form.values.place}
/> />
<Input
name='city'
label='City'
onChange={form.handleChange}
onBlur={form.handleBlur}
value={form.values.city}
/>
<Box
display='grid'
gridTemplateColumns='2fr 1fr'
columnGap='10px'
>
<Input <Input
name='country' name='country'
label='Country' label='Country'
value='' onChange={form.handleChange}
onChange={() => {}} onBlur={form.handleBlur}
value={form.values.country}
/> />
<Box display='grid' gridTemplateColumns='2fr 1fr' columnGap='10px'>
<Input name='city' label='City' value='' onChange={() => {}} />
<Input <Input
name='zipCode' name='zip'
label='Zip Code' label='Zip Code'
value='' onChange={form.handleChange}
onChange={() => {}} onBlur={form.handleBlur}
value={form.values.zip}
/> />
</Box> </Box>
<Box marginTop='0.5rem'> <Box marginTop='0.5rem'>
@@ -86,10 +184,14 @@ const AdditionalInfo = () => {
variant='primary-action' variant='primary-action'
color='client' color='client'
text='Done' text='Done'
onClick={() => {}} type='submit'
loading={loading}
disabled={loading}
/> />
</Box> </Box>
{error && <Alert color='error' text={error} />}
</Box> </Box>
</form>
</Box> </Box>
</Box> </Box>
</Wrapper> </Wrapper>