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