From 625c9284ce3df240cff0862af9f3e954d9aa7d04 Mon Sep 17 00:00:00 2001 From: Alexandru Munteanu <alexandru.munt@gmail.com> Date: Thu, 19 Apr 2018 14:40:50 +0300 Subject: [PATCH] feat(reviewer-signup): handle new reviewer --- packages/component-mail-service/src/Mail.js | 1 + .../src/components/Details.js | 11 ++- .../src/routes/users/resetPassword.js | 12 +-- .../src/components/SignUp/ReviewerSignUp.js | 99 +++++++++++-------- .../components-faraday/src/redux/reviewers.js | 48 ++++----- packages/xpub-faraday/app/routes.js | 6 +- 6 files changed, 100 insertions(+), 77 deletions(-) diff --git a/packages/component-mail-service/src/Mail.js b/packages/component-mail-service/src/Mail.js index e153a5bd6..e5e4bbbd2 100644 --- a/packages/component-mail-service/src/Mail.js +++ b/packages/component-mail-service/src/Mail.js @@ -5,6 +5,7 @@ const Email = require('@pubsweet/component-send-email') const config = require('config') const resetPasswordPath = config.get('invite-reviewer.url') +const resetPath = config.get('invite-reset-password.url') module.exports = { setupInviteEmail: async (user, emailType, inviteUrl) => { diff --git a/packages/component-manuscript/src/components/Details.js b/packages/component-manuscript/src/components/Details.js index 2249fc2a1..22d929367 100644 --- a/packages/component-manuscript/src/components/Details.js +++ b/packages/component-manuscript/src/components/Details.js @@ -5,6 +5,7 @@ import { compose, lifecycle } from 'recompose' import { selectCurrentUser } from 'xpub-selectors' import { parseSearchParams } from './utils' +import { reviewerAccept } from '../../../components-faraday/src/redux/reviewers' const Details = () => <div>eu sunt manuscript details</div> @@ -13,13 +14,15 @@ export default compose( state => ({ currentUser: selectCurrentUser(state), }), - { replace }, + { reviewerAccept, replace }, ), lifecycle({ componentDidMount() { - const { location, replace } = this.props - const { accept } = parseSearchParams(location.search) - if (accept === 'true') { + const { reviewerAccept, location, match, replace } = this.props + const collectionId = match.params.project + const { agree, invitationId } = parseSearchParams(location.search) + if (agree === 'true') { + reviewerAccept(invitationId, collectionId) replace(location.pathname) } }, diff --git a/packages/component-user-manager/src/routes/users/resetPassword.js b/packages/component-user-manager/src/routes/users/resetPassword.js index b0970a994..facf2d7c1 100644 --- a/packages/component-user-manager/src/routes/users/resetPassword.js +++ b/packages/component-user-manager/src/routes/users/resetPassword.js @@ -11,17 +11,7 @@ module.exports = models => async (req, res) => { password, token, } = req.body - if ( - !helpers.checkForUndefinedParams( - email, - firstName, - lastName, - title, - affiliation, - password, - token, - ) - ) { + if (!helpers.checkForUndefinedParams(email, password, token)) { res.status(400).json({ error: 'missing required params' }) return } diff --git a/packages/components-faraday/src/components/SignUp/ReviewerSignUp.js b/packages/components-faraday/src/components/SignUp/ReviewerSignUp.js index 3598fe6b1..da6f8fd6d 100644 --- a/packages/components-faraday/src/components/SignUp/ReviewerSignUp.js +++ b/packages/components-faraday/src/components/SignUp/ReviewerSignUp.js @@ -1,9 +1,10 @@ import React from 'react' import { connect } from 'react-redux' import { reduxForm } from 'redux-form' +import { push } from 'react-router-redux' import { required, minChars } from 'xpub-validators' -import { Button, ValidatedField, TextField } from '@pubsweet/ui' import { compose, withState, lifecycle } from 'recompose' +import { Button, ValidatedField, TextField } from '@pubsweet/ui' import { Row, @@ -17,14 +18,15 @@ import { FormContainer, } from './FormItems' import { parseSearchParams } from './utils' -import { - setReviewerPassword, - reviewerAccept, - reviewerDecline, -} from '../../redux/reviewers' +import { reviewerDecision, setReviewerPassword } from '../../redux/reviewers' const min8Chars = minChars(8) -const ReviewerSignUp = ({ handleSubmit, error, reviewer }) => ( +const ReviewerSignUp = ({ + searchParams: { agree }, + handleSubmit, + error, + reviewer, +}) => ( <RootContainer> <Title>Hindawi Invitation</Title> <Subtitle> @@ -32,47 +34,62 @@ const ReviewerSignUp = ({ handleSubmit, error, reviewer }) => ( Please set a password and proceed to the manuscript. </Subtitle> <Email>{reviewer.email}</Email> - <FormContainer onSubmit={handleSubmit}> - <Row> - <RowItem> - <Label> Password </Label> - <ValidatedField - component={input => <TextField {...input} type="password" />} - name="password" - validate={[required, min8Chars]} - /> - </RowItem> - </Row> - {error && ( + {agree ? ( + <FormContainer onSubmit={handleSubmit}> <Row> <RowItem> - <Err>{error}</Err> + <Label> Password </Label> + <ValidatedField + component={input => <TextField {...input} type="password" />} + name="password" + validate={[required, min8Chars]} + /> </RowItem> </Row> - )} - <Row> - <Button primary type="submit"> - CONFIRM - </Button> - </Row> - </FormContainer> + {error && ( + <Row> + <RowItem> + <Err>{error}</Err> + </RowItem> + </Row> + )} + <Row> + <Button primary type="submit"> + CONFIRM + </Button> + </Row> + </FormContainer> + ) : ( + <span>sorry</span> + )} </RootContainer> ) export default compose( + withState('searchParams', 'setParams', { agree: true }), withState('reviewer', 'setReviewer', {}), - connect(null, { setReviewerPassword, reviewerAccept, reviewerDecline }), + connect(null, { push, setReviewerPassword, reviewerDecision }), lifecycle({ componentDidMount() { - const { location, setReviewer, reviewerDecline } = this.props - const { decision = true, ...reviewerBody } = parseSearchParams( - location.search, - ) + const { setParams, location, setReviewer, reviewerDecision } = this.props + const { + agree, + collectionId, + invitationId, + fragmentId, + ...reviewerBody + } = parseSearchParams(location.search) + setParams(v => ({ + agree: agree === 'true', + collectionId, + invitationId, + fragmentId, + })) - if (decision) { + if (agree === 'true') { setReviewer(reviewerBody) } else { - reviewerDecline() + reviewerDecision(invitationId, collectionId, false) } }, }), @@ -81,12 +98,16 @@ export default compose( onSubmit: ( { password }, dispatch, - { reviewer, location, setReviewerPassword }, + { push, searchParams, reviewer, location, setReviewerPassword }, ) => { - setReviewerPassword({ - ...reviewer, - password, - }) + // setReviewerPassword({ + // ...reviewer, + // password, + // }) + const { agree, collectionId, invitationId, fragmentId } = searchParams + push( + `/projects/${collectionId}/versions/${fragmentId}/details?agree=${agree}&invitationId=${invitationId}`, + ) }, }), )(ReviewerSignUp) diff --git a/packages/components-faraday/src/redux/reviewers.js b/packages/components-faraday/src/redux/reviewers.js index d8e5fbc0d..a54bd5ab1 100644 --- a/packages/components-faraday/src/redux/reviewers.js +++ b/packages/components-faraday/src/redux/reviewers.js @@ -1,5 +1,10 @@ import { get } from 'lodash' -import { get as apiGet, create, remove } from 'pubsweet-client/src/helpers/api' +import { + get as apiGet, + create, + remove, + update, +} from 'pubsweet-client/src/helpers/api' const GET_REVIEWERS_REQUEST = 'GET_REVIEWERS_REQUEST' const GET_REVIEWERS_ERROR = 'GET_REVIEWERS_ERROR' @@ -43,10 +48,10 @@ const REVIEWER_DECISION_ERROR = 'REVIEWER_DECISION_ERROR' const REVIEWER_DECISION_SUCCESS = 'REVIEWER_DECISION_SUCCESS' const reviewerDecisionRequest = () => ({ type: REVIEWER_DECISION_REQUEST }) -// const reviewerDecisionError = error => ({ -// type: REVIEWER_DECISION_ERROR, -// error, -// }) +const reviewerDecisionError = error => ({ + type: REVIEWER_DECISION_ERROR, + error, +}) const reviewerDecisionSuccess = () => ({ type: REVIEWER_DECISION_SUCCESS }) const initialState = { @@ -101,26 +106,25 @@ export const revokeReviewer = (invitationId, collectionId) => dispatch => { } // reviewer decision actions -export const reviewerAccept = () => dispatch => { +export const reviewerDecision = ( + invitationId, + collectionId, + agree = true, +) => dispatch => { dispatch(reviewerDecisionRequest()) // 'accept api call' - return new Promise(resolve => { - setTimeout(() => { + return update(`/collections/${collectionId}/invitations/${invitationId}`, { + isAccepted: agree, + }).then( + res => { dispatch(reviewerDecisionSuccess()) - resolve({ name: 'coco' }) - }, 1500) - }) -} - -export const reviewerDecline = () => dispatch => { - dispatch(reviewerDecisionRequest()) - // 'decline api call' - return new Promise(resolve => { - setTimeout(() => { - dispatch(reviewerDecisionSuccess()) - resolve({ name: 'coco' }) - }, 1500) - }) + return res + }, + err => { + dispatch(reviewerDecisionError(err.message)) + return err + }, + ) } export default (state = initialState, action = {}) => { diff --git a/packages/xpub-faraday/app/routes.js b/packages/xpub-faraday/app/routes.js index c65e01a8e..4eca5f8fc 100644 --- a/packages/xpub-faraday/app/routes.js +++ b/packages/xpub-faraday/app/routes.js @@ -62,7 +62,11 @@ const Routes = () => ( /> <Route component={SignUpInvitationPage} exact path="/invite" /> <Route component={ReviewerSignUp} exact path="/invite-reviewer" /> - <PrivateRoute component={ManuscriptDetails} exact path="/manu-details" /> + <PrivateRoute + component={ManuscriptDetails} + exact + path="/projects/:project/versions/:version/details" + /> <Route component={NotFound} /> </Switch> </FaradayApp> -- GitLab