Complete additional info logic

This commit is contained in:
Hazem Krimi
2021-04-29 19:12:18 +01:00
parent 1db8dc2430
commit ae6c8164f7
+162 -60
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,75 +94,104 @@ const AdditionalInfo = () => {
Tell us more about yourself Tell us more about yourself
</Text> </Text>
</Box> </Box>
<Box <form onSubmit={form.handleSubmit}>
display='grid'
gridTemplateColumns='auto'
rowGap='0.5rem'
position='relative'
>
<Input
name='firstName'
label='First Name'
value=''
onChange={() => {}}
/>
<Input
name='lastName'
label='Last Name'
value=''
onChange={() => {}}
/>
<Box <Box
display='grid' display='grid'
gridTemplateColumns='1fr 1.5fr' gridTemplateColumns='auto'
columnGap='10px' rowGap='0.5rem'
position='relative'
> >
<Select <Input
name='coutryConde' name='firstName'
label='Country Code' label='First Name'
options={[{ value: '+216', label: '+216' }]} value={form.values.firstName}
onChange={() => {}} onChange={form.handleChange}
value='' onBlur={form.handleBlur}
error={!!form.errors.firstName}
errorMessage={form.errors.firstName}
/> />
<Input <Input
name='phone' name='lastName'
type='tel' label='Last Name'
label='Phone' value={form.values.lastName}
value='' onChange={form.handleChange}
onChange={() => {}} onBlur={form.handleBlur}
error={!!form.errors.lastName}
errorMessage={form.errors.lastName}
/> />
</Box> <Box
<Input display='grid'
name='address' gridTemplateColumns='1fr 1.5fr'
label='Address' columnGap='10px'
value='' >
onChange={() => {}} <Select
/> name='prefix'
<Input label='Country Code'
name='country' options={[
label='Country' { value: '+216', label: '+216' },
value='' { value: '+213', label: '+213' },
onChange={() => {}} ]}
/> onChange={form.handleChange}
<Box display='grid' gridTemplateColumns='2fr 1fr' columnGap='10px'> onBlur={form.handleBlur}
<Input name='city' label='City' value='' onChange={() => {}} /> value={form.values.prefix}
/>
<Input
name='number'
type='tel'
label='Phone'
onChange={form.handleChange}
onBlur={form.handleBlur}
value={form.values.number}
/>
</Box>
<Input <Input
name='zipCode' name='place'
label='Zip Code' label='Address'
value='' onChange={form.handleChange}
onChange={() => {}} onBlur={form.handleBlur}
value={form.values.place}
/> />
</Box> <Input
<Box marginTop='0.5rem'> name='city'
<Button label='City'
fullWidth onChange={form.handleChange}
variant='primary-action' onBlur={form.handleBlur}
color='client' value={form.values.city}
text='Done'
onClick={() => {}}
/> />
<Box
display='grid'
gridTemplateColumns='2fr 1fr'
columnGap='10px'
>
<Input
name='country'
label='Country'
onChange={form.handleChange}
onBlur={form.handleBlur}
value={form.values.country}
/>
<Input
name='zip'
label='Zip Code'
onChange={form.handleChange}
onBlur={form.handleBlur}
value={form.values.zip}
/>
</Box>
<Box marginTop='0.5rem'>
<Button
fullWidth
variant='primary-action'
color='client'
text='Done'
type='submit'
loading={loading}
disabled={loading}
/>
</Box>
{error && <Alert color='error' text={error} />}
</Box> </Box>
</Box> </form>
</Box> </Box>
</Box> </Box>
</Wrapper> </Wrapper>