import React from 'react' import { get } from 'lodash' import { connect } from 'react-redux' import { actions } from 'pubsweet-client' import { required } from 'xpub-validators' import styled from 'styled-components' import { reduxForm, formValueSelector } from 'redux-form' import { compose, setDisplayName, withProps } from 'recompose' import { Icon, Button, Spinner, RadioGroup, ValidatedField } from '@pubsweet/ui' import { FormItems } from '../UIComponents' import { selectError, selectFetching, createRecommendation, } from '../../redux/recommendations' import { subtitleParser, decisions, parseFormValues } from './utils' import { getHERecommendation } from '../../../../component-faraday-selectors' const { Err, Row, Title, Label, RowItem, Subtitle, RootContainer, FormContainer, TextAreaField, CustomRadioGroup, } = FormItems const Form = RootContainer.withComponent(FormContainer) const DecisionForm = ({ aHERec, decision, hideModal, isFetching, handleSubmit, recommendationError, heRecommendation: { reason, message = '' }, }) => ( <Form onSubmit={handleSubmit}> <IconButton onClick={hideModal}> <Icon primary>x</Icon> </IconButton> <Title>Make decision</Title> {!!reason && ( <CustomSubtitle> Recommended to<BoldSubtitle>{reason}</BoldSubtitle> </CustomSubtitle> )} {!!message && ( <Row> <RowItem vertical> <Label>Message from Handling Editor</Label> <span>{message}</span> </RowItem> </Row> )} <Row> <RowItem vertical> <Label>Your Decision</Label> <ValidatedField component={input => ( <CustomRadioGroup className="custom-radio-group" justify={reason ? 'space-between' : 'space-around'} > <RadioGroup name="decision" options={reason ? decisions : decisions.slice(0, 2)} {...input} /> </CustomRadioGroup> )} name="decision" /> </RowItem> </Row> {decision === 'return-to-handling-editor' && ( <Row> <RowItem vertical> <Label>Comments for Handling Editor</Label> <ValidatedField component={TextAreaField} name="messageToHE" validate={[required]} /> </RowItem> </Row> )} {recommendationError && ( <Row> <RowItem centered> <Err>{recommendationError}</Err> </RowItem> </Row> )} <Row> <RowItem centered> <Button onClick={hideModal}>Cancel</Button> </RowItem> <RowItem centered> {isFetching ? ( <Spinner size={3} /> ) : ( <Button primary type="submit"> Submit </Button> )} </RowItem> </Row> </Form> ) const selector = formValueSelector('eicDecision') export default compose( setDisplayName('DecisionForm'), connect( (state, { fragmentId, collectionId }) => ({ isFetching: selectFetching(state), decision: selector(state, 'decision'), recommendationError: selectError(state), heRecommendation: getHERecommendation(state, collectionId, fragmentId), }), { createRecommendation, getCollections: actions.getCollections }, ), withProps(({ heRecommendation: { recommendation = '', comments = [] } }) => ({ heRecommendation: { reason: subtitleParser(recommendation), message: get(comments.find(c => !c.public), 'content'), }, })), reduxForm({ form: 'eicDecision', onSubmit: ( values, dispatch, { showModal, hideModal, fragmentId, collectionId, getCollections, createRecommendation, }, ) => { const recommendation = parseFormValues(values) createRecommendation(collectionId, fragmentId, recommendation).then(r => { showModal({ onCancel: () => { getCollections() hideModal() }, title: 'Decision submitted', cancelText: 'OK', }) }) }, }), )(DecisionForm) // #region styled-components const IconButton = styled.div` align-self: flex-end; cursor: pointer; ` const CustomSubtitle = Subtitle.extend` align-items: center; display: flex; flex-direction: row; justify-content: center; ` const BoldSubtitle = Subtitle.extend` font-weight: bold; margin-left: 5px; ` // #endregion