From 0d84c1db8d6b428a501c525c25e74914ce69270b Mon Sep 17 00:00:00 2001
From: Alexandru Munteanu <alexandru.munt@gmail.com>
Date: Wed, 11 Apr 2018 13:07:18 +0300
Subject: [PATCH] feat(invite-reviewers): api calls

---
 .../src/components/withModal.js               |  1 +
 .../src/components/Dashboard/DashboardCard.js |  2 +-
 .../components/Reviewers/InviteReviewers.js   |  9 ++--
 .../src/components/Reviewers/ReviewerForm.js  | 35 ++++++++++------
 .../src/components/Reviewers/ReviewerList.js  | 41 +++++++++++++++----
 .../components-faraday/src/redux/reviewers.js | 14 +++++--
 6 files changed, 74 insertions(+), 28 deletions(-)

diff --git a/packages/component-modal/src/components/withModal.js b/packages/component-modal/src/components/withModal.js
index 37ad52995..59f223682 100644
--- a/packages/component-modal/src/components/withModal.js
+++ b/packages/component-modal/src/components/withModal.js
@@ -21,6 +21,7 @@ const withModal = ({
   modalKey,
   modalComponent: Component,
   overlayColor,
+  ...rest
 }) => WrappedComponent =>
   connect(mapState, mapDispatch(modalKey))(
     ({
diff --git a/packages/components-faraday/src/components/Dashboard/DashboardCard.js b/packages/components-faraday/src/components/Dashboard/DashboardCard.js
index d9075da0c..620eff5a3 100644
--- a/packages/components-faraday/src/components/Dashboard/DashboardCard.js
+++ b/packages/components-faraday/src/components/Dashboard/DashboardCard.js
@@ -140,7 +140,7 @@ const DashboardCard = ({
               {renderHandlingEditorRow()}
             </LeftDetails>
           </Bottom>
-          <InviteReviewers />
+          <InviteReviewers project={project} />
         </DetailsView>
       )}
     </Card>
diff --git a/packages/components-faraday/src/components/Reviewers/InviteReviewers.js b/packages/components-faraday/src/components/Reviewers/InviteReviewers.js
index 4e05ed405..c7a0ab7bc 100644
--- a/packages/components-faraday/src/components/Reviewers/InviteReviewers.js
+++ b/packages/components-faraday/src/components/Reviewers/InviteReviewers.js
@@ -14,7 +14,7 @@ const InviteReviewers = ({ showInviteModal }) => (
 )
 
 const InviteReviewersModal = withTheme(
-  ({ theme, hideModal, onConfirm, showModal }) => (
+  ({ theme, hideModal, onConfirm, showModal, collectionId }) => (
     <Root>
       <CloseIcon data-test="icon-modal-hide" onClick={hideModal}>
         <Icon color={theme.colorPrimary}>x</Icon>
@@ -23,10 +23,10 @@ const InviteReviewersModal = withTheme(
       <Title>Invite Reviewers</Title>
 
       <Subtitle>Invite reviewer</Subtitle>
-      <ReviewerForm />
+      <ReviewerForm collectionId={collectionId} />
 
       <Subtitle>Reviewers Info</Subtitle>
-      <ReviewersList showModal={showModal} />
+      <ReviewersList collectionId={collectionId} showModal={showModal} />
     </Root>
   ),
 )
@@ -46,9 +46,10 @@ export default compose(
     modalComponent: ModalSwitcher,
   }),
   withHandlers({
-    showInviteModal: ({ showModal, hideModal }) => () => {
+    showInviteModal: ({ showModal, hideModal, project }) => () => {
       showModal({
         type: 'invite-reviewers',
+        collectionId: project.id,
         onConfirm: () => {
           hideModal()
         },
diff --git a/packages/components-faraday/src/components/Reviewers/ReviewerForm.js b/packages/components-faraday/src/components/Reviewers/ReviewerForm.js
index 6ad7b65a5..a9a43e2e8 100644
--- a/packages/components-faraday/src/components/Reviewers/ReviewerForm.js
+++ b/packages/components-faraday/src/components/Reviewers/ReviewerForm.js
@@ -1,22 +1,15 @@
 import React from 'react'
-import { get } from 'lodash'
+import { get, pick } from 'lodash'
 import { connect } from 'react-redux'
 import styled from 'styled-components'
 import { th, Button } from '@pubsweet/ui'
-import { compose, withHandlers } from 'recompose'
+import { compose, withHandlers, lifecycle } from 'recompose'
 import { reduxForm, change as changeForm, initialize } from 'redux-form'
 
 import { ReviewersSelect } from './'
-import { inviteReviewer } from '../../redux/reviewers'
+import { inviteReviewer, getCollectionUsers } from '../../redux/reviewers'
 import { ValidatedTextField } from '../AuthorList/FormItems'
 
-// const emailRegex = new RegExp(
-//   /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i, //eslint-disable-line
-// )
-
-// const emailValidator = value =>
-//   emailRegex.test(value) ? undefined : 'Invalid email'
-
 const ReviewerForm = ({ clearForm, selectReviewer, handleSubmit, users }) => (
   <Root>
     <Row>
@@ -41,11 +34,21 @@ export default compose(
     state => ({
       users: get(state, 'users.users') || [],
     }),
-    { changeForm, initialize, inviteReviewer },
+    { changeForm, initialize, inviteReviewer, getCollectionUsers },
   ),
   reduxForm({
     form: 'inviteReviewer',
-    onSubmit: (values, dispatch, { inviteReviewer }) => {},
+    onSubmit: (values, dispatch, { inviteReviewer, collectionId }) => {
+      const reviewerData = pick(values, [
+        'email',
+        'firstName',
+        'lastName',
+        'affiliation',
+      ])
+      inviteReviewer(reviewerData, collectionId).then(r =>
+        console.log('l-am invitat -> ', r),
+      )
+    },
   }),
   withHandlers({
     selectReviewer: ({ changeForm, initialize }) => reviewer => () => {
@@ -57,6 +60,14 @@ export default compose(
       reset()
     },
   }),
+  lifecycle({
+    componentDidMount() {
+      const { getCollectionUsers, collectionId } = this.props
+      getCollectionUsers(collectionId).then(r =>
+        console.log('get collection users', r),
+      )
+    },
+  }),
 )(ReviewerForm)
 
 // #region styled-components
diff --git a/packages/components-faraday/src/components/Reviewers/ReviewerList.js b/packages/components-faraday/src/components/Reviewers/ReviewerList.js
index 56a2770fb..05bc64c5c 100644
--- a/packages/components-faraday/src/components/Reviewers/ReviewerList.js
+++ b/packages/components-faraday/src/components/Reviewers/ReviewerList.js
@@ -1,8 +1,12 @@
 import React from 'react'
+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 { revokeReviewer, inviteReviewer } from '../../redux/reviewers'
+
 const defaultReviewers = [
   {
     email: 'sebi1@morti.com',
@@ -78,8 +82,8 @@ const ReviewersList = ({
             <StatusText>{r.lastUpdated}</StatusText>
           </Column>
           <ResendRevoke
-            showConfirmResend={showConfirmResend}
-            showConfirmRevoke={showConfirmRevoke}
+            showConfirmResend={showConfirmResend(r)}
+            showConfirmRevoke={showConfirmRevoke(r.status)}
           />
         </ReviewerItem>
       ))}
@@ -88,9 +92,11 @@ const ReviewersList = ({
 )
 
 export default compose(
+  connect(null, { inviteReviewer, revokeReviewer }),
   withHandlers({
-    goBackToReviewers: ({ showModal, hideModal }) => () => {
+    goBackToReviewers: ({ showModal, hideModal, collectionId }) => () => {
       showModal({
+        collectionId,
         type: 'invite-reviewers',
         onConfirm: () => {
           hideModal()
@@ -99,17 +105,38 @@ export default compose(
     },
   }),
   withHandlers({
-    showConfirmResend: ({ showModal, goBackToReviewers }) => () => {
+    showConfirmResend: ({
+      showModal,
+      goBackToReviewers,
+      inviteReviewer,
+      collectionId,
+    }) => reviewer => () => {
       showModal({
         title: 'Resend confirmation',
-        onConfirm: goBackToReviewers,
+        onConfirm: () => {
+          inviteReviewer(
+            pick(reviewer, ['email', 'firstName', 'lastName', 'affiliation']),
+            collectionId,
+          ).then(goBackToReviewers, goBackToReviewers)
+        },
         onCancel: goBackToReviewers,
       })
     },
-    showConfirmRevoke: ({ showModal, hideModal, goBackToReviewers }) => () => {
+    showConfirmRevoke: ({
+      showModal,
+      hideModal,
+      goBackToReviewers,
+      revokeReviewer,
+      collectionId,
+    }) => invitationId => () => {
       showModal({
         title: 'Revoke confirmation',
-        onConfirm: goBackToReviewers,
+        onConfirm: () => {
+          revokeReviewer(invitationId, collectionId).then(
+            goBackToReviewers,
+            goBackToReviewers,
+          )
+        },
         onCancel: goBackToReviewers,
       })
     },
diff --git a/packages/components-faraday/src/redux/reviewers.js b/packages/components-faraday/src/redux/reviewers.js
index 153f73774..483417d02 100644
--- a/packages/components-faraday/src/redux/reviewers.js
+++ b/packages/components-faraday/src/redux/reviewers.js
@@ -1,16 +1,22 @@
-import { create } from 'pubsweet-client/src/helpers/api'
+import { get as apiGet, create, remove } from 'pubsweet-client/src/helpers/api'
 
 const initialState = {
   fetching: false,
 }
 
-export const inviteReviewer = (email, collectionId) => dispatch => {
-  create(`collections/${collectionId}/invitation`, {
-    email,
+export const getCollectionUsers = collectionId => dispatch =>
+  apiGet(`/collections/${collectionId}/invitations`)
+
+export const inviteReviewer = (reviewerData, collectionId) => dispatch => {
+  create(`/collections/${collectionId}/invitations`, {
+    ...reviewerData,
     role: 'reviewer',
   })
 }
 
+export const revokeReviewer = (invitationId, collectionId) => dispatch =>
+  remove(`/collections/${collectionId}/invitations/${invitationId}`)
+
 export default (state = initialState, action = {}) => {
   switch (action.type) {
     default:
-- 
GitLab