From e7947db62b8f17e534f2341ea575e4f8d26cc4f1 Mon Sep 17 00:00:00 2001 From: Bogdan Cochior <bogdan.cochior@thinslices.com> Date: Thu, 15 Mar 2018 11:48:08 +0200 Subject: [PATCH] refactor: fix HIN-449, add error handling --- .gitlab-ci.yml | 2 +- .../src/controllers/inviteGlobalRole.js | 3 +- .../src/components/Admin/AddEditUser.js | 22 +++++++++--- .../src/components/Admin/AddUserForm.js | 33 ++++++++++++----- .../src/components/Admin/EditUserForm.js | 35 +++++++++++++------ .../components/SignUp/SignUpInvitationForm.js | 1 + .../components/SignUp/SignUpInvitationPage.js | 2 +- .../src/components/SignUp/SignUpStep0.js | 13 +++---- 8 files changed, 77 insertions(+), 34 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7a12bd070..ae3880d67 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -61,7 +61,7 @@ demo:now: - master environment: name: $PACKAGE_NAME/demo - url: $NOW_URL + url: https://xpub-faraday.now.sh/ script: - npm i -g --unsafe-perm now - cd ${HOME}/now diff --git a/packages/component-invite/src/controllers/inviteGlobalRole.js b/packages/component-invite/src/controllers/inviteGlobalRole.js index 825583195..4cf92182f 100644 --- a/packages/component-invite/src/controllers/inviteGlobalRole.js +++ b/packages/component-invite/src/controllers/inviteGlobalRole.js @@ -47,7 +47,8 @@ module.exports = async (body, models, res, url) => { return res.status(200).json(newUser) } catch (e) { - return res.status(500).json({ error: e.message }) + logger.error(e.message) + return res.status(500).json({ error: 'Email could not be sent.' }) } } } diff --git a/packages/components-faraday/src/components/Admin/AddEditUser.js b/packages/components-faraday/src/components/Admin/AddEditUser.js index fa5a61a9b..45454fbd8 100644 --- a/packages/components-faraday/src/components/Admin/AddEditUser.js +++ b/packages/components-faraday/src/components/Admin/AddEditUser.js @@ -19,13 +19,13 @@ const onSubmit = (values, dispatch, { isEdit, history }) => { if (!isEdit) { const newValues = setAdmin(values) return create('/users/invite', newValues) - .then(r => history.push('/admin/users')) + .then(() => history.push('/admin/users')) .catch(error => { const err = get(error, 'response') if (err) { const errorMessage = get(JSON.parse(err), 'error') throw new SubmissionError({ - email: errorMessage || 'Something went wrong', + _error: errorMessage || 'Something went wrong', }) } }) @@ -40,23 +40,35 @@ const onSubmit = (values, dispatch, { isEdit, history }) => { if (err) { const errorMessage = get(JSON.parse(err), 'error') throw new SubmissionError({ - roles: errorMessage || 'Something went wrong', + _error: errorMessage || 'Something went wrong', }) } }) } -const AddEditUser = ({ handleSubmit, journal, isEdit, user, history }) => ( +const AddEditUser = ({ + handleSubmit, + journal, + isEdit, + user, + history, + error, +}) => ( <Root> <FormContainer onSubmit={handleSubmit}> {isEdit ? ( <EditUserForm + error={error} journal={journal} roles={getRoleOptions(journal)} user={user} /> ) : ( - <AddUserForm journal={journal} roles={getRoleOptions(journal)} /> + <AddUserForm + error={error} + journal={journal} + roles={getRoleOptions(journal)} + /> )} <Row> <Button onClick={history.goBack}>Back</Button> diff --git a/packages/components-faraday/src/components/Admin/AddUserForm.js b/packages/components-faraday/src/components/Admin/AddUserForm.js index 4317c2c4f..3858fa2a5 100644 --- a/packages/components-faraday/src/components/Admin/AddUserForm.js +++ b/packages/components-faraday/src/components/Admin/AddUserForm.js @@ -1,10 +1,17 @@ import React from 'react' import styled from 'styled-components' -import { ValidatedField, TextField, Menu } from '@pubsweet/ui' +import { ValidatedField, TextField, Menu, th } from '@pubsweet/ui' import { required } from 'xpub-validators' -const AddUserForm = ({ roles, journal }) => { +const emailRegex = new RegExp( + /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i, //eslint-disable-line +) + +const emailValidator = value => + emailRegex.test(value) ? undefined : 'Invalid email' + +const AddUserForm = ({ roles, journal, error }) => { const roleOptions = roles.filter(r => ['editorInChief', 'author', 'admin'].includes(r.value), ) @@ -17,7 +24,7 @@ const AddUserForm = ({ roles, journal }) => { <ValidatedField component={TextField} name="email" - validate={[required]} + validate={[emailValidator]} /> </RowItem> <RowItem> @@ -52,6 +59,9 @@ const AddUserForm = ({ roles, journal }) => { /> </RowItem> </Row> + <Row> + <RowItem>{error && <ErrorMessage>{error}</ErrorMessage>}</RowItem> + </Row> </div> ) } @@ -63,22 +73,27 @@ export default AddUserForm const Row = styled.div` display: flex; flex-direction: row; - margin: 20px 0; + margin: calc(${th('subGridUnit')}*3) 0; ` const RowItem = styled.div` flex: 1; - margin-right: 20px; + margin-right: calc(${th('subGridUnit')}*3); ` const Title = styled.h4` - font-size: ${({ theme }) => theme.fontSizeHeading4}; - color: ${({ theme }) => theme.colorPrimary}; - margin: 10px 0; + font-size: ${th('fontSizeHeading4')}; + color: ${th('colorPrimary')}; + margin: calc(${th('subGridUnit')}*2) 0; ` const Label = styled.div` - font-size: ${({ theme }) => theme.fontSizeBase}; + font-size: ${th('fontSizeBase')}; text-transform: uppercase; ` + +const ErrorMessage = styled.div` + color: ${th('colorError')}; +` + // #endregion diff --git a/packages/components-faraday/src/components/Admin/EditUserForm.js b/packages/components-faraday/src/components/Admin/EditUserForm.js index 1f908b0a5..06cb09c44 100644 --- a/packages/components-faraday/src/components/Admin/EditUserForm.js +++ b/packages/components-faraday/src/components/Admin/EditUserForm.js @@ -1,10 +1,16 @@ import React from 'react' import styled from 'styled-components' -import { ValidatedField, TextField, Menu, CheckboxGroup } from '@pubsweet/ui' +import { + ValidatedField, + TextField, + Menu, + CheckboxGroup, + th, +} from '@pubsweet/ui' import { required } from 'xpub-validators' -const EditUserForm = ({ roles, journal, user }) => { +const EditUserForm = ({ roles, journal, user, error }) => { const roleOptions = roles.filter(r => ['editorInChief', 'author', 'admin'].includes(r.value), ) @@ -58,6 +64,9 @@ const EditUserForm = ({ roles, journal, user }) => { /> </RowItem> </Row> + <Row> + <RowItem>{error && <ErrorMessage>{error}</ErrorMessage>}</RowItem> + </Row> </div> ) } @@ -69,29 +78,33 @@ export default EditUserForm const Row = styled.div` display: flex; flex-direction: row; - margin: 20px 0; - background-color: ${({ theme }) => theme.backgroundColorReverse}; + margin: calc(${th('subGridUnit')}*3) 0; + background-color: ${th('backgroundColorReverse')}; ` const RowItem = styled.div` flex: 1; - margin-right: 20px; + margin-right: calc(${th('subGridUnit')}*3); ` const Title = styled.h4` - font-size: ${({ theme }) => theme.fontSizeHeading4}; - color: ${({ theme }) => theme.colorPrimary}; - margin: 10px 0; + font-size: ${th('fontSizeHeading4')}; + color: ${th('colorPrimary')}; + margin: calc(${th('subGridUnit')}*2) 0; ` const Subtitle = styled.div` - font-size: ${({ theme }) => theme.fontSizeBase}; - color: ${({ theme }) => theme.colorPrimary}; + font-size: ${th('fontSizeBase')}; + color: ${th('colorPrimary')}; margin: 0; ` const Label = styled.div` - font-size: ${({ theme }) => theme.fontSizeBase}; + font-size: ${th('fontSizeBase')}; text-transform: uppercase; ` +const ErrorMessage = styled.div` + color: ${th('colorError')}; +` + // #endregion diff --git a/packages/components-faraday/src/components/SignUp/SignUpInvitationForm.js b/packages/components-faraday/src/components/SignUp/SignUpInvitationForm.js index 007ee79b8..ac7399aa0 100644 --- a/packages/components-faraday/src/components/SignUp/SignUpInvitationForm.js +++ b/packages/components-faraday/src/components/SignUp/SignUpInvitationForm.js @@ -24,6 +24,7 @@ const SignUpInvitation = ({ {error && <Err>Token expired or Something went wrong.</Err>} {step === 0 && ( <Step0 + error={error} initialValues={initialValues} journal={journal} onSubmit={nextStep} diff --git a/packages/components-faraday/src/components/SignUp/SignUpInvitationPage.js b/packages/components-faraday/src/components/SignUp/SignUpInvitationPage.js index 6dcd11f46..569988891 100644 --- a/packages/components-faraday/src/components/SignUp/SignUpInvitationPage.js +++ b/packages/components-faraday/src/components/SignUp/SignUpInvitationPage.js @@ -42,7 +42,7 @@ const confirmUser = (email, token, history) => (values, dispatch) => { if (err) { const errorMessage = get(JSON.parse(err), 'error') throw new SubmissionError({ - password: errorMessage || 'Something went wrong', + _error: errorMessage || 'Something went wrong', }) } }) diff --git a/packages/components-faraday/src/components/SignUp/SignUpStep0.js b/packages/components-faraday/src/components/SignUp/SignUpStep0.js index e14fd717c..2fb7bb2fd 100644 --- a/packages/components-faraday/src/components/SignUp/SignUpStep0.js +++ b/packages/components-faraday/src/components/SignUp/SignUpStep0.js @@ -5,7 +5,7 @@ import { isUndefined } from 'lodash' import { required } from 'xpub-validators' import { Button, ValidatedField, TextField, Menu } from '@pubsweet/ui' -const Step0 = ({ journal, handleSubmit, initialValues }) => +const Step0 = ({ journal, handleSubmit, initialValues, error }) => !isUndefined(initialValues) ? ( <FormContainer onSubmit={handleSubmit}> <Row> @@ -18,23 +18,24 @@ const Step0 = ({ journal, handleSubmit, initialValues }) => /> </RowItem> <RowItem> - <Label> Affiliation* </Label> + <Label> Last name* </Label> <ValidatedField component={TextField} - name="affiliation" + name="lastName" validate={[required]} /> </RowItem> </Row> <Row> <RowItem> - <Label> Last name* </Label> + <Label> Affiliation* </Label> <ValidatedField component={TextField} - name="lastName" + name="affiliation" validate={[required]} /> </RowItem> + <RowItem> <Label> Title* </Label> <ValidatedField @@ -51,7 +52,7 @@ const Step0 = ({ journal, handleSubmit, initialValues }) => </Row> </FormContainer> ) : ( - <div>Loading...</div> + <div>{!isUndefined(error) && 'Loading...'}</div> ) export default reduxForm({ -- GitLab