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