diff --git a/packages/backend/src/graphql/mutations/update-user.ts b/packages/backend/src/graphql/mutations/update-user.ts index 94515464..8e0a5de8 100644 --- a/packages/backend/src/graphql/mutations/update-user.ts +++ b/packages/backend/src/graphql/mutations/update-user.ts @@ -4,6 +4,7 @@ type Params = { input: { email: string; password: string; + fullName: string; }; }; @@ -15,6 +16,7 @@ const updateUser = async ( const user = await context.currentUser.$query().patchAndFetch({ email: params.input.email, password: params.input.password, + fullName: params.input.fullName, }); return user; diff --git a/packages/backend/src/graphql/schema.graphql b/packages/backend/src/graphql/schema.graphql index 4dec2ecc..458abe2e 100644 --- a/packages/backend/src/graphql/schema.graphql +++ b/packages/backend/src/graphql/schema.graphql @@ -351,6 +351,7 @@ input CreateUserInput { input UpdateUserInput { email: String password: String + fullName: String } input ForgotPasswordInput { diff --git a/packages/web/src/graphql/mutations/update-user.ts b/packages/web/src/graphql/mutations/update-user.ts index fa188cc7..74324829 100644 --- a/packages/web/src/graphql/mutations/update-user.ts +++ b/packages/web/src/graphql/mutations/update-user.ts @@ -4,8 +4,8 @@ export const UPDATE_USER = gql` mutation UpdateUser($input: UpdateUserInput) { updateUser(input: $input) { id + fullName email - updatedAt } } `; diff --git a/packages/web/src/graphql/queries/get-current-user.ts b/packages/web/src/graphql/queries/get-current-user.ts index 4d3151c3..9a17de1f 100644 --- a/packages/web/src/graphql/queries/get-current-user.ts +++ b/packages/web/src/graphql/queries/get-current-user.ts @@ -6,8 +6,6 @@ export const GET_CURRENT_USER = gql` id fullName email - createdAt - updatedAt } } `; diff --git a/packages/web/src/locales/en.json b/packages/web/src/locales/en.json index 56b65f62..3ee5fd94 100644 --- a/packages/web/src/locales/en.json +++ b/packages/web/src/locales/en.json @@ -83,13 +83,12 @@ "execution.noDataTitle": "No data", "execution.noDataMessage": "We successfully ran the execution, but there was no new data to process.", "profileSettings.title": "My Profile", + "profileSettings.fullName": "Full name", "profileSettings.email": "Email", - "profileSettings.updateEmail": "Update email", + "profileSettings.updateProfile": "Update your profile", + "profileSettings.updatedProfile": "Your profile has been updated.", "profileSettings.newPassword": "New password", "profileSettings.confirmNewPassword": "Confirm new password", - "profileSettings.updatedEmail": "Your email has been updated.", - "profileSettings.updatedPassword": "Your password has been updated.", - "profileSettings.updatePassword": "Update password", "profileSettings.deleteMyAccount": "Delete my account", "profileSettings.deleteAccount": "Delete account", "profileSettings.deleteAccountSubtitle": "This will permanently delete...", @@ -154,4 +153,4 @@ "invoices.amount": "Amount", "invoices.invoice": "Invoice", "invoices.link": "Link" -} \ No newline at end of file +} diff --git a/packages/web/src/pages/ProfileSettings/index.tsx b/packages/web/src/pages/ProfileSettings/index.tsx index f13968f1..4cda68e6 100644 --- a/packages/web/src/pages/ProfileSettings/index.tsx +++ b/packages/web/src/pages/ProfileSettings/index.tsx @@ -19,18 +19,19 @@ import { UPDATE_USER } from 'graphql/mutations/update-user'; import useFormatMessage from 'hooks/useFormatMessage'; import useCurrentUser from 'hooks/useCurrentUser'; -const emailValidationSchema = yup - .object({ - email: yup.string().email().required(), - }) - .required(); +type TMutationInput = { + fullName: string; + email: string; + password?: string; +} -const passwordValidationSchema = yup +const validationSchema = yup .object({ - password: yup.string().required(), + fullName: yup.string().required(), + email: yup.string().email().required(), + password: yup.string(), confirmPassword: yup .string() - .required() .oneOf([yup.ref('password')], 'Passwords must match'), }) .required(); @@ -43,54 +44,42 @@ const StyledForm = styled(Form)` function ProfileSettings() { const [showDeleteAccountConfirmation, setShowDeleteAccountConfirmation] = React.useState(false); - const [passwordDefaultValues, setPasswordDefaultValues] = React.useState({}); const { enqueueSnackbar } = useSnackbar(); const currentUser = useCurrentUser(); const formatMessage = useFormatMessage(); const [updateUser] = useMutation(UPDATE_USER); - const handleEmailUpdate = async (data: any) => { - const email = data.email; + const handleProfileSettingsUpdate = async (data: any) => { + const { fullName, password, email } = data; + + const mutationInput: TMutationInput = { + fullName, + email, + } + + if (password) { + mutationInput.password = password; + } await updateUser({ variables: { - input: { - email, - }, + input: mutationInput, }, optimisticResponse: { updateUser: { __typename: 'User', + id: currentUser.id, + fullName, email, }, }, }); - enqueueSnackbar(formatMessage('profileSettings.updatedEmail'), { + enqueueSnackbar(formatMessage('profileSettings.updatedProfile'), { variant: 'success', }); }; - const handlePasswordUpdate = async (data: any) => { - const password = data.password; - - setPasswordDefaultValues({ - password, - confirmPassword: data.confirmPassword, - }); - - await updateUser({ - variables: { - input: { - password, - }, - }, - }); - - enqueueSnackbar(formatMessage('profileSettings.updatedPassword'), { - variant: 'success', - }); - }; return ( @@ -100,10 +89,10 @@ function ProfileSettings() { - ( <> + + - - - )} - /> - - ( - <> @@ -167,7 +139,7 @@ function ProfileSettings() { fullWidth name="confirmPassword" label={formatMessage('profileSettings.confirmNewPassword')} - margin="normal" + margin='dense' type="password" error={ touchedFields.confirmPassword && !!errors?.confirmPassword @@ -184,7 +156,7 @@ function ProfileSettings() { type="submit" disabled={!isDirty || !isValid || isSubmitting} > - {formatMessage('profileSettings.updatePassword')} + {formatMessage('profileSettings.updateProfile')} )}