From a26f7aea13d28c2c50f302177464da1cdcc0dc41 Mon Sep 17 00:00:00 2001
From: Alexandru Munteanu <alexandru.munt@gmail.com>
Date: Tue, 24 Apr 2018 15:03:28 +0300
Subject: [PATCH] feat(invite-reviewer): filter users who already answered,
 sort reviewers

---
 .../src/components/Reviewers/InviteReviewers.js    |  1 +
 .../src/components/Reviewers/ReviewerForm.js       | 11 +++++++++--
 .../src/components/Reviewers/ReviewerList.js       | 14 +++++++++++---
 packages/components-faraday/src/redux/reviewers.js |  5 +++--
 packages/components-faraday/src/redux/utils.js     | 11 +++++++++++
 5 files changed, 35 insertions(+), 7 deletions(-)
 create mode 100644 packages/components-faraday/src/redux/utils.js

diff --git a/packages/components-faraday/src/components/Reviewers/InviteReviewers.js b/packages/components-faraday/src/components/Reviewers/InviteReviewers.js
index 272a4c02d..bd8722dc0 100644
--- a/packages/components-faraday/src/components/Reviewers/InviteReviewers.js
+++ b/packages/components-faraday/src/components/Reviewers/InviteReviewers.js
@@ -71,6 +71,7 @@ const InviteReviewersModal = compose(
         collectionId={collectionId}
         getReviewers={getReviewers}
         isFetching={fetchingInvite}
+        reviewers={reviewers}
       />
 
       <Row>
diff --git a/packages/components-faraday/src/components/Reviewers/ReviewerForm.js b/packages/components-faraday/src/components/Reviewers/ReviewerForm.js
index 923c669e1..8234bcad1 100644
--- a/packages/components-faraday/src/components/Reviewers/ReviewerForm.js
+++ b/packages/components-faraday/src/components/Reviewers/ReviewerForm.js
@@ -1,9 +1,9 @@
 import React from 'react'
-import { get, pick } from 'lodash'
 import { connect } from 'react-redux'
 import styled from 'styled-components'
 import { compose, withHandlers } from 'recompose'
 import { th, Button, Spinner } from '@pubsweet/ui'
+import { get, pick, differenceWith } from 'lodash'
 import { reduxForm, change as changeForm, initialize } from 'redux-form'
 
 import { ReviewersSelect } from './'
@@ -16,10 +16,11 @@ const ReviewerForm = ({
   handleSubmit,
   users,
   isFetching,
+  filteredUsers,
 }) => (
   <Root>
     <Row>
-      <ReviewersSelect onSelect={selectReviewer} values={users} />
+      <ReviewersSelect onSelect={selectReviewer} values={filteredUsers()} />
       <ValidatedTextField isRequired label="Last name*" name="lastName" />
     </Row>
     <Row>
@@ -76,6 +77,12 @@ export default compose(
     clearForm: ({ reset }) => () => {
       reset()
     },
+    filteredUsers: ({ users, reviewers }) => () =>
+      differenceWith(
+        users,
+        reviewers.filter(r => r.status !== 'pending'),
+        (user, reviewer) => user.email === reviewer.email,
+      ),
   }),
 )(ReviewerForm)
 
diff --git a/packages/components-faraday/src/components/Reviewers/ReviewerList.js b/packages/components-faraday/src/components/Reviewers/ReviewerList.js
index 4dcf29933..1e6e44fcd 100644
--- a/packages/components-faraday/src/components/Reviewers/ReviewerList.js
+++ b/packages/components-faraday/src/components/Reviewers/ReviewerList.js
@@ -3,8 +3,8 @@ import moment from 'moment'
 import { pick } from 'lodash'
 import { connect } from 'react-redux'
 import { th, Icon } from '@pubsweet/ui'
-import { compose, withHandlers } from 'recompose'
 import styled, { withTheme } from 'styled-components'
+import { compose, withHandlers, withProps } from 'recompose'
 
 import { revokeReviewer, inviteReviewer } from '../../redux/reviewers'
 
@@ -24,6 +24,7 @@ const ResendRevoke = withTheme(
 )
 
 const ReviewersList = ({
+  renderAcceptedLabel,
   reviewers,
   showConfirmResend,
   showConfirmRevoke,
@@ -38,7 +39,9 @@ const ReviewersList = ({
               <div>
                 <ReviewerName>{r.name}</ReviewerName>
                 {r.status === 'accepted' && (
-                  <AcceptedReviewer>{`Reviewer ${index + 1}`}</AcceptedReviewer>
+                  <AcceptedReviewer>
+                    {renderAcceptedLabel(index)}
+                  </AcceptedReviewer>
                 )}
               </div>
               <ReviewerEmail>{r.email}</ReviewerEmail>
@@ -47,7 +50,7 @@ const ReviewersList = ({
               <StatusText>{r.status}</StatusText>
               <DateText>{renderTimestamp(r.timestamp)}</DateText>
             </Column>
-            {r.status !== 'accepted' ? (
+            {r.status === 'pending' ? (
               <ResendRevoke
                 showConfirmResend={showConfirmResend(r)}
                 showConfirmRevoke={showConfirmRevoke(r.invitationId)}
@@ -64,6 +67,9 @@ const ReviewersList = ({
 
 export default compose(
   connect(null, { inviteReviewer, revokeReviewer }),
+  withProps(({ reviewers = [] }) => ({
+    firstAccepted: reviewers.findIndex(r => r.status === 'accepted'),
+  })),
   withHandlers({
     renderTimestamp: () => timestamp => {
       const today = moment()
@@ -84,6 +90,8 @@ export default compose(
         },
       })
     },
+    renderAcceptedLabel: ({ firstAccepted }) => index =>
+      `Reviewer ${index - firstAccepted + 1}`,
   }),
   withHandlers({
     showConfirmResend: ({
diff --git a/packages/components-faraday/src/redux/reviewers.js b/packages/components-faraday/src/redux/reviewers.js
index 7f5795c31..51d559637 100644
--- a/packages/components-faraday/src/redux/reviewers.js
+++ b/packages/components-faraday/src/redux/reviewers.js
@@ -1,4 +1,4 @@
-import { get } from 'lodash'
+import { get, orderBy } from 'lodash'
 import { selectCurrentUser } from 'xpub-selectors'
 import {
   get as apiGet,
@@ -6,6 +6,7 @@ import {
   remove,
   update,
 } from 'pubsweet-client/src/helpers/api'
+import { orderReviewers } from './utils'
 
 const GET_REVIEWERS_REQUEST = 'GET_REVIEWERS_REQUEST'
 const GET_REVIEWERS_ERROR = 'GET_REVIEWERS_ERROR'
@@ -86,7 +87,7 @@ export const selectInvitation = (state, collectionId) => {
 export const getCollectionReviewers = collectionId => dispatch => {
   dispatch(getReviewersRequest())
   return apiGet(`/collections/${collectionId}/invitations?role=reviewer`).then(
-    r => dispatch(getReviewersSuccess(r)),
+    r => dispatch(getReviewersSuccess(orderBy(r, orderReviewers))),
     err => dispatch(getReviewersError(err)),
   )
 }
diff --git a/packages/components-faraday/src/redux/utils.js b/packages/components-faraday/src/redux/utils.js
new file mode 100644
index 000000000..2f7f9cdca
--- /dev/null
+++ b/packages/components-faraday/src/redux/utils.js
@@ -0,0 +1,11 @@
+export const orderReviewers = r => {
+  switch (r.status) {
+    case 'pending':
+      return -1
+    case 'accepted':
+      return 0
+    case 'refused':
+    default:
+      return 1
+  }
+}
-- 
GitLab