From e66a85cb3bbe444da7208f8a219fc42c931c1947 Mon Sep 17 00:00:00 2001
From: Daniel Sandu <daniel.sandu@thinslices.com>
Date: Tue, 23 Oct 2018 18:25:40 +0300
Subject: [PATCH] refactor(handleRecommendation): refactor
 handleRecommendation, moved all recommendation logic

---
 .../src/components/ManuscriptLayout.js        |  9 +--
 .../src/components/ManuscriptPage.js          | 47 +--------------
 .../src/components/utils.js                   | 12 ----
 .../handleRecommendation.api.js               | 11 ++++
 .../src/handleRecommendation/utils.js         | 10 ++++
 .../withHandleRecommendation.js               | 59 +++++++++++++++++++
 .../src/inviteReviewer/withInviteReviewer.js  |  6 +-
 7 files changed, 88 insertions(+), 66 deletions(-)
 create mode 100644 packages/component-manuscript/src/handleRecommendation/handleRecommendation.api.js
 create mode 100644 packages/component-manuscript/src/handleRecommendation/utils.js
 create mode 100644 packages/component-manuscript/src/handleRecommendation/withHandleRecommendation.js

diff --git a/packages/component-manuscript/src/components/ManuscriptLayout.js b/packages/component-manuscript/src/components/ManuscriptLayout.js
index c02738c34..527861a2f 100644
--- a/packages/component-manuscript/src/components/ManuscriptLayout.js
+++ b/packages/component-manuscript/src/components/ManuscriptLayout.js
@@ -35,7 +35,6 @@ const ManuscriptLayout = ({
   getSignedUrl,
   editorInChief,
   handlingEditors,
-  createRecommendation,
   editorialRecommendations,
   journal = {},
   collection = {},
@@ -59,7 +58,6 @@ const ManuscriptLayout = ({
   shouldReview,
   submittedOwnRecommendation,
   reviewerReports,
-  onEditorialRecommendation,
   reviewerRecommendations,
   toggleReviewerDetails,
   reviewerDetailsExpanded,
@@ -67,6 +65,7 @@ const ManuscriptLayout = ({
   toggleEditorialComments,
   submitRevision,
   inviteReviewer,
+  recommendationHandle,
 }) => (
   <Root pb={30}>
     {!isEmpty(collection) && !isEmpty(fragment) ? (
@@ -205,7 +204,9 @@ const ManuscriptLayout = ({
               hasReviewerReports={reviewerRecommendations.length > 0}
               highlight={reviewerRecommendations.length > 0}
               modalKey="heRecommendation"
-              onRecommendationSubmit={onEditorialRecommendation}
+              onRecommendationSubmit={
+                recommendationHandle.onEditorialRecommendation
+              }
             />
           )}
 
@@ -216,7 +217,7 @@ const ManuscriptLayout = ({
             highlight={editorialRecommendations.length > 0}
             messagesLabel={messagesLabel}
             mt={2}
-            submitDecision={createRecommendation}
+            submitDecision={recommendationHandle.createRecommendation}
           />
         )}
       </Fragment>
diff --git a/packages/component-manuscript/src/components/ManuscriptPage.js b/packages/component-manuscript/src/components/ManuscriptPage.js
index 5fd6b730f..2dc4481e2 100644
--- a/packages/component-manuscript/src/components/ManuscriptPage.js
+++ b/packages/component-manuscript/src/components/ManuscriptPage.js
@@ -27,7 +27,6 @@ import {
   clearCustomError,
 } from 'pubsweet-components-faraday/src/redux/errors'
 import {
-  createRecommendation,
   selectReviewRecommendations,
   selectEditorialRecommendations,
 } from 'pubsweet-components-faraday/src/redux/recommendations'
@@ -65,8 +64,8 @@ import {
 import ManuscriptLayout from './ManuscriptLayout'
 import withInviteReviewer from '../inviteReviewer/withInviteReviewer'
 import withSubmitRevision from '../submitRevision/withSubmitRevision'
+import withHandleRecommendation from '../handleRecommendation/withHandleRecommendation'
 import {
-  parseEicDecision,
   parseSearchParams,
   redirectToError,
   getPublonsReviewers,
@@ -284,28 +283,6 @@ export default compose(
           modalProps.hideModal()
         })
         .catch(handleError(modalProps.setModalError)),
-    createRecommendation: ({
-      fragment,
-      collection,
-      fetchUpdatedCollection,
-    }) => (values, modalProps) => {
-      const recommendation = parseEicDecision(values)
-      modalProps.setFetching(true)
-      createRecommendation({
-        recommendation,
-        fragmentId: fragment.id,
-        collectionId: collection.id,
-      })
-        .then(() => {
-          modalProps.setFetching(false)
-          modalProps.hideModal()
-          fetchUpdatedCollection()
-        })
-        .catch(err => {
-          modalProps.setFetching(false)
-          handleError(modalProps.setModalError)(err)
-        })
-    },
     onHEResponse: ({
       history,
       collection,
@@ -334,27 +311,6 @@ export default compose(
           handleError(setModalError)(err)
         })
     },
-    onEditorialRecommendation: ({
-      fragment,
-      collection,
-      fetchUpdatedCollection,
-    }) => (recommendation, { hideModal, setFetching, setModalError }) => {
-      setFetching(true)
-      createRecommendation({
-        recommendation,
-        fragmentId: fragment.id,
-        collectionId: collection.id,
-      })
-        .then(r => {
-          setFetching(false)
-          hideModal()
-          fetchUpdatedCollection()
-        })
-        .catch(e => {
-          setFetching(false)
-          handleError(setModalError)(e)
-        })
-    },
   }),
   fromRenderProps(RemoteOpener, ({ toggle, expanded }) => ({
     toggleAssignHE: toggle,
@@ -388,6 +344,7 @@ export default compose(
   })),
   withInviteReviewer,
   withSubmitRevision,
+  withHandleRecommendation,
   lifecycle({
     componentDidMount() {
       const {
diff --git a/packages/component-manuscript/src/components/utils.js b/packages/component-manuscript/src/components/utils.js
index 8d9a2d6cc..e579d6836 100644
--- a/packages/component-manuscript/src/components/utils.js
+++ b/packages/component-manuscript/src/components/utils.js
@@ -293,18 +293,6 @@ export const requiredFiles = (values, formValues) => {
   return undefined
 }
 
-// new stuff
-export const parseEicDecision = ({ decision, message }) => ({
-  recommendation: decision,
-  recommendationType: 'editorRecommendation',
-  comments: [
-    {
-      public: decision !== 'return-to-handling-editor',
-      content: message,
-    },
-  ],
-})
-
 // handle publons
 export const getPublonsReviewers = fragmentId =>
   apiGet(`/fragments/${fragmentId}/publons`)
diff --git a/packages/component-manuscript/src/handleRecommendation/handleRecommendation.api.js b/packages/component-manuscript/src/handleRecommendation/handleRecommendation.api.js
new file mode 100644
index 000000000..5109ba04f
--- /dev/null
+++ b/packages/component-manuscript/src/handleRecommendation/handleRecommendation.api.js
@@ -0,0 +1,11 @@
+import { create } from 'pubsweet-client/src/helpers/api'
+
+export const createRecommendation = ({
+  fragmentId,
+  collectionId,
+  recommendation,
+}) =>
+  create(
+    `/collections/${collectionId}/fragments/${fragmentId}/recommendations`,
+    recommendation,
+  )
diff --git a/packages/component-manuscript/src/handleRecommendation/utils.js b/packages/component-manuscript/src/handleRecommendation/utils.js
new file mode 100644
index 000000000..700c21bd5
--- /dev/null
+++ b/packages/component-manuscript/src/handleRecommendation/utils.js
@@ -0,0 +1,10 @@
+export const parseEicDecision = ({ decision, message }) => ({
+  recommendation: decision,
+  recommendationType: 'editorRecommendation',
+  comments: [
+    {
+      public: decision !== 'return-to-handling-editor',
+      content: message,
+    },
+  ],
+})
diff --git a/packages/component-manuscript/src/handleRecommendation/withHandleRecommendation.js b/packages/component-manuscript/src/handleRecommendation/withHandleRecommendation.js
new file mode 100644
index 000000000..020d7e45d
--- /dev/null
+++ b/packages/component-manuscript/src/handleRecommendation/withHandleRecommendation.js
@@ -0,0 +1,59 @@
+import { pick } from 'lodash'
+import { withHandlers, withProps, compose } from 'recompose'
+import { handleError, withFetching } from 'pubsweet-component-faraday-ui'
+import { parseEicDecision } from './utils'
+import { createRecommendation } from './handleRecommendation.api'
+
+export default compose(
+  withFetching,
+  withHandlers({
+    createRecommendation: ({
+      fragment,
+      collection,
+      fetchUpdatedCollection,
+    }) => (values, modalProps) => {
+      const recommendation = parseEicDecision(values)
+      modalProps.setFetching(true)
+      createRecommendation({
+        recommendation,
+        fragmentId: fragment.id,
+        collectionId: collection.id,
+      })
+        .then(() => {
+          modalProps.setFetching(false)
+          modalProps.hideModal()
+          fetchUpdatedCollection()
+        })
+        .catch(err => {
+          modalProps.setFetching(false)
+          handleError(modalProps.setModalError)(err)
+        })
+    },
+    onEditorialRecommendation: ({
+      fragment,
+      collection,
+      fetchUpdatedCollection,
+    }) => (recommendation, { hideModal, setFetching, setModalError }) => {
+      setFetching(true)
+      createRecommendation({
+        recommendation,
+        fragmentId: fragment.id,
+        collectionId: collection.id,
+      })
+        .then(r => {
+          setFetching(false)
+          hideModal()
+          fetchUpdatedCollection()
+        })
+        .catch(e => {
+          setFetching(false)
+          handleError(setModalError)(e)
+        })
+    },
+  }),
+  withProps(props => ({
+    recommendationHandle: {
+      ...pick(props, ['createRecommendation', 'onEditorialRecommendation']),
+    },
+  })),
+)
diff --git a/packages/component-manuscript/src/inviteReviewer/withInviteReviewer.js b/packages/component-manuscript/src/inviteReviewer/withInviteReviewer.js
index 87470cf50..fd06ce32b 100644
--- a/packages/component-manuscript/src/inviteReviewer/withInviteReviewer.js
+++ b/packages/component-manuscript/src/inviteReviewer/withInviteReviewer.js
@@ -2,11 +2,7 @@ import { get, pick } from 'lodash'
 import { withRouter } from 'react-router-dom'
 import { compose, withHandlers, withProps } from 'recompose'
 import { handleError, withFetching } from 'pubsweet-component-faraday-ui'
-import {
-  inviteReviewer,
-  revokeReviewer,
-  reviewerDecision,
-} from 'pubsweet-components-faraday/src/redux/reviewers'
+import { inviteReviewer, revokeReviewer, reviewerDecision } from './invite.api'
 
 export default compose(
   withFetching,
-- 
GitLab