Skip to content
Snippets Groups Projects
Commit e1816c53 authored by Alexandru Munteanu's avatar Alexandru Munteanu
Browse files

refactor(invitation-errors): handle reviewer network errors

parent 7bc4da2f
No related branches found
No related tags found
1 merge request!6Agree/Decline to work on a manuscript
...@@ -11,10 +11,11 @@ import { ...@@ -11,10 +11,11 @@ import {
import { ReviewerBreakdown } from '../Invitations' import { ReviewerBreakdown } from '../Invitations'
import { ReviewerForm, ReviewersList } from './' import { ReviewerForm, ReviewersList } from './'
import { import {
getCollectionReviewers,
selectReviewers, selectReviewers,
selectFetchingReviewers,
selectFetchingInvite, selectFetchingInvite,
selectReviewersError,
selectFetchingReviewers,
getCollectionReviewers,
} from '../../redux/reviewers' } from '../../redux/reviewers'
const InviteReviewers = ({ showInviteModal }) => ( const InviteReviewers = ({ showInviteModal }) => (
...@@ -26,8 +27,9 @@ const InviteReviewersModal = compose( ...@@ -26,8 +27,9 @@ const InviteReviewersModal = compose(
connect( connect(
state => ({ state => ({
reviewers: selectReviewers(state), reviewers: selectReviewers(state),
fetchingReviewers: selectFetchingReviewers(state), reviewerError: selectReviewersError(state),
fetchingInvite: selectFetchingInvite(state), fetchingInvite: selectFetchingInvite(state),
fetchingReviewers: selectFetchingReviewers(state),
}), }),
{ getCollectionReviewers }, { getCollectionReviewers },
), ),
...@@ -56,6 +58,7 @@ const InviteReviewersModal = compose( ...@@ -56,6 +58,7 @@ const InviteReviewersModal = compose(
invitations, invitations,
collectionId, collectionId,
getReviewers, getReviewers,
reviewerError,
fetchingInvite, fetchingInvite,
fetchingReviewers, fetchingReviewers,
}) => ( }) => (
...@@ -71,6 +74,7 @@ const InviteReviewersModal = compose( ...@@ -71,6 +74,7 @@ const InviteReviewersModal = compose(
collectionId={collectionId} collectionId={collectionId}
getReviewers={getReviewers} getReviewers={getReviewers}
isFetching={fetchingInvite} isFetching={fetchingInvite}
reviewerError={reviewerError}
reviewers={reviewers} reviewers={reviewers}
/> />
......
...@@ -11,12 +11,13 @@ import { inviteReviewer } from '../../redux/reviewers' ...@@ -11,12 +11,13 @@ import { inviteReviewer } from '../../redux/reviewers'
import { ValidatedTextField } from '../AuthorList/FormItems' import { ValidatedTextField } from '../AuthorList/FormItems'
const ReviewerForm = ({ const ReviewerForm = ({
clearForm,
selectReviewer,
handleSubmit,
users, users,
clearForm,
isFetching, isFetching,
handleSubmit,
filteredUsers, filteredUsers,
reviewerError,
selectReviewer,
}) => ( }) => (
<Root> <Root>
<Row> <Row>
...@@ -27,6 +28,11 @@ const ReviewerForm = ({ ...@@ -27,6 +28,11 @@ const ReviewerForm = ({
<ValidatedTextField label="First name" name="firstName" /> <ValidatedTextField label="First name" name="firstName" />
<ValidatedTextField label="Affiliation" name="affiliation" /> <ValidatedTextField label="Affiliation" name="affiliation" />
</Row> </Row>
{reviewerError && (
<CenterRow>
<Err>{reviewerError}</Err>
</CenterRow>
)}
<ButtonsContainer> <ButtonsContainer>
<FormButton onClick={clearForm}>Clear</FormButton> <FormButton onClick={clearForm}>Clear</FormButton>
{isFetching ? ( {isFetching ? (
...@@ -92,6 +98,12 @@ const FormButton = styled(Button)` ...@@ -92,6 +98,12 @@ const FormButton = styled(Button)`
margin: ${th('subGridUnit')}; margin: ${th('subGridUnit')};
` `
const Err = styled.span`
color: ${th('colorError')};
font-family: ${th('fontReading')};
font-size: ${th('fontSizeBaseSmall')};
`
const ButtonsContainer = styled.div` const ButtonsContainer = styled.div`
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
...@@ -111,6 +123,10 @@ const Row = styled.div` ...@@ -111,6 +123,10 @@ const Row = styled.div`
flex-direction: row; flex-direction: row;
` `
const CenterRow = Row.extend`
justify-content: center;
`
const Root = styled.div` const Root = styled.div`
align-self: stretch; align-self: stretch;
border: ${th('borderDefault')}; border: ${th('borderDefault')};
......
...@@ -76,12 +76,7 @@ const emailRegex = new RegExp( ...@@ -76,12 +76,7 @@ const emailRegex = new RegExp(
export const emailValidator = value => export const emailValidator = value =>
emailRegex.test(value) ? undefined : 'Invalid email' emailRegex.test(value) ? undefined : 'Invalid email'
const alreadyAnswered = `You have already answered this invitation.`
export const redirectToError = redirectFn => err => { export const redirectToError = redirectFn => err => {
const errorText = get(JSON.parse(err.response), 'error') const errorText = get(JSON.parse(err.response), 'error')
if (errorText.includes('has already been answered')) { redirectFn('/error-page', errorText || 'Oops! Something went wrong.')
redirectFn('/error-page', alreadyAnswered)
} else {
redirectFn('/error-page', 'Oops! Something went wrong.')
}
} }
...@@ -68,6 +68,7 @@ const initialState = { ...@@ -68,6 +68,7 @@ const initialState = {
// selectors // selectors
export const selectReviewers = state => get(state, 'reviewers.reviewers') || [] export const selectReviewers = state => get(state, 'reviewers.reviewers') || []
export const selectReviewersError = state => get(state, 'reviewers.error')
export const selectFetchingReviewers = state => export const selectFetchingReviewers = state =>
get(state, 'reviewers.fetching.reviewers') || false get(state, 'reviewers.fetching.reviewers') || false
export const selectFetchingInvite = state => export const selectFetchingInvite = state =>
...@@ -98,7 +99,10 @@ export const inviteReviewer = (reviewerData, collectionId) => dispatch => { ...@@ -98,7 +99,10 @@ export const inviteReviewer = (reviewerData, collectionId) => dispatch => {
return create(`/collections/${collectionId}/invitations`, { return create(`/collections/${collectionId}/invitations`, {
...reviewerData, ...reviewerData,
role: 'reviewer', role: 'reviewer',
}).then(() => dispatch(inviteSuccess()), err => dispatch(inviteError(err))) }).then(
() => dispatch(inviteSuccess()),
err => dispatch(inviteError(get(JSON.parse(err.response), 'error'))),
)
} }
export const setReviewerPassword = reviewerBody => dispatch => { export const setReviewerPassword = reviewerBody => dispatch => {
...@@ -205,6 +209,7 @@ export default (state = initialState, action = {}) => { ...@@ -205,6 +209,7 @@ export default (state = initialState, action = {}) => {
...state.fetching, ...state.fetching,
invite: false, invite: false,
}, },
error: null,
} }
case INVITE_REVIEWER_ERROR: case INVITE_REVIEWER_ERROR:
return { return {
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment