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