diff --git a/src/pages/Settings/index.tsx b/src/pages/Settings/index.tsx new file mode 100644 index 0000000..d944938 --- /dev/null +++ b/src/pages/Settings/index.tsx @@ -0,0 +1,371 @@ +import * as Yup from 'yup'; +import { useFormik } from 'formik'; +import { useHistory } from 'react-router'; +import { useMutation, useReactiveVar } from '@apollo/client'; +import { useState } from 'react'; +import { roleVar, userVar } from '../../graphql/state'; +import { + Box, + Button, + Text, + SectionSelector, + Input, + Select, + Alert, +} from '../../components'; +import { Wrapper } from './styles'; +import { ArrowLeft, Profile, Security } from '../../assets'; +import { + UpdateUserInfoMutation, + UpdateUserPasswordMutation, + UpdateUserInfoMutationVariables, + UpdateUserPasswordMutationVariables, +} from '../../graphql/types'; +import { UPDATE_USER_INFO, UPDATE_USER_PASSWORD } from '../../graphql/auth.api'; + +const Settings = () => { + const history = useHistory(); + const role = useReactiveVar(roleVar); + const currentUser = useReactiveVar(userVar); + + const [selectedSection, setSelectedSection] = useState< + 'general' | 'security' + >('general'); + const [error, setError] = useState(''); + const [success, setSuccess] = useState(false); + + const [updateUserInfo, { loading: generalLoading }] = useMutation< + UpdateUserInfoMutation, + UpdateUserInfoMutationVariables + >(UPDATE_USER_INFO, { + onCompleted({ updateUserInfo: user }) { + userVar(user); + generalForm.setFieldValue('firstName', user.firstName); + generalForm.setFieldValue('lastName', user.lastName); + generalForm.setFieldValue('prefix', user.phone.prefix); + generalForm.setFieldValue('number', user.phone.number); + generalForm.setFieldValue('place', user.address.place); + generalForm.setFieldValue('city', user.address.city); + generalForm.setFieldValue('zip', user.address.zip); + generalForm.setFieldValue('country', user.address.country); + setSuccess(true); + setTimeout(() => setSuccess(false), 3000); + }, + onError({ graphQLErrors }) { + setError(graphQLErrors[0]?.extensions?.info); + setTimeout(() => setError(''), 3000); + }, + }); + + const generalForm = useFormik({ + initialValues: { + firstName: currentUser?.firstName || '', + lastName: currentUser?.lastName || '', + prefix: currentUser?.phone.prefix || '', + number: currentUser?.phone.number || '', + place: currentUser?.address.place || '', + city: currentUser?.address.city || '', + zip: currentUser?.address.zip || '', + country: currentUser?.address.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, + }) => + updateUserInfo({ + variables: { + id: currentUser?.id!, + email: currentUser?.email!, + firstName, + lastName, + phone: { prefix, number }, + address: { place, city, country, zip }, + }, + }), + }); + + const [updateUserPassword, { loading: securityLoading }] = useMutation< + UpdateUserPasswordMutation, + UpdateUserPasswordMutationVariables + >(UPDATE_USER_PASSWORD, { + onCompleted({ updateUserPassword: user }) { + userVar(user); + setSuccess(true); + setTimeout(() => setSuccess(false), 3000); + }, + onError({ graphQLErrors }) { + setError(graphQLErrors[0]?.extensions?.info); + setTimeout(() => setError(''), 3000); + }, + }); + + const securityForm = useFormik({ + initialValues: { + oldPassword: '', + newPassword: '', + confirmNewPassword: '', + }, + validationSchema: Yup.object().shape({ + oldPassword: Yup.string() + .required('Password is required') + .min(6, 'Password is 6 characters minimum'), + newPassword: Yup.string() + .notOneOf( + [Yup.ref('oldPassword')], + 'New password should not be old password' + ) + .required('New password is required') + .min(6, 'New password is 6 characters minimum'), + confirmNewPassword: Yup.string().oneOf( + [Yup.ref('newPassword')], + "Confirm new password doesn't match with new password" + ), + }), + onSubmit: ({ oldPassword, newPassword }) => + updateUserPassword({ + variables: { + id: currentUser?.id!, + password: { oldPassword, newPassword }, + }, + }), + }); + + return ( + + +