Newer
Older
import React from 'react'
import { get } from 'lodash'
import { connect } from 'react-redux'
import { push, replace } from 'react-router-redux'
import { required, minChars } from 'xpub-validators'
import { reduxForm, SubmissionError } from 'redux-form'
import { compose, withState, lifecycle } from 'recompose'
import { loginUser } from 'pubsweet-component-login/actions'
import { Button, ValidatedField, TextField } from '@pubsweet/ui'
import { redirectToError } from '../utils'
import { FormItems } from '../UIComponents'

Alexandru Munteanu
committed
import { reviewerDecision, setReviewerPassword } from '../../redux/reviewers'
Row,
Err,
Title,
Label,
Email,
RowItem,
Subtitle,
RootContainer,
FormContainer,
} = FormItems
const agreeText = `You have been invited to review a manuscript on the Hindawi platform. Please set a password and proceed to the manuscript.`
const declineText = `You have decline to work on a manuscript.`
const PasswordField = input => <TextField {...input} type="password" />
const min8Chars = minChars(8)
const ReviewerInviteDecision = ({
agree,
handleSubmit,
errorMessage,

Alexandru Munteanu
committed
reviewerEmail,
<RootContainer bordered>
<Title>Reviewer Invitation</Title>
<Subtitle>{agree === 'true' ? agreeText : declineText}</Subtitle>
<Email>{reviewerEmail}</Email>
{agree === 'true' && (
<FormContainer onSubmit={handleSubmit}>
<Row>
<Label> Password </Label>
<ValidatedField
name="password"
validate={[required, min8Chars]}
/>
</RowItem>
</Row>
{error && (
<Row>
<RowItem>
<Err>Token expired or Something went wrong.</Err>
</RowItem>
</Row>
)}
<Row>
<Button primary type="submit">
CONFIRM
</Button>
</Row>
</FormContainer>
)}
</RootContainer>
)
export default compose(
withState('reviewerEmail', 'setEmail', ''),
connect(null, {
push,
replace,
loginUser,
reviewerDecision,

Alexandru Munteanu
committed
setReviewerPassword,
}),
lifecycle({
componentDidMount() {
const {
agree,
email,
replace,
fragmentId,
collectionId,
invitationId,
reviewerDecision,
} = this.props
setEmail(email)
if (agree === 'false') {
reviewerDecision(invitationId, collectionId, fragmentId, false).catch(
redirectToError(replace),
)
},
}),
reduxForm({
form: 'invite-reviewer',
onSubmit: (
{ password },
dispatch,
{
push,
email,
token,
loginUser,
fragmentId,
collectionId,
invitationId,
setReviewerPassword,
},
) =>
setReviewerPassword({
email,
token,
password,
})
.then(() => {
loginUser(
{ username: email, password },
`/projects/${collectionId}/versions/${fragmentId}/details?agree=${true}&invitationId=${invitationId}`,
)
})
.catch(error => {
const err = get(error, 'response')
if (err) {
const errorMessage = get(JSON.parse(err), 'error')
throw new SubmissionError({
_error: errorMessage || 'Something went wrong',
})
}
)(ReviewerInviteDecision)