import React, { Fragment } from 'react' import { isNumber } from 'lodash' import styled from 'styled-components' import { reduxForm } from 'redux-form' import { th } from '@pubsweet/ui-toolkit' import { required } from 'xpub-validators' import { H3, ValidatedField, TextField, Checkbox } from '@pubsweet/ui' import { compose, setDisplayName, withStateHandlers } from 'recompose' import Tag from './Tag' import Label from './Label' import Row from './gridItems/Row' import Item from './gridItems/Item' import PersonInfo from './PersonInfo' import IconButton from './IconButton' // #region AuthorTitle const AuthorTitle = ({ editMode, listIndex, saveChanges, isSubmitting, toggleEditMode, isCorresponding, }) => ( <Fragment> {!editMode ? ( <IconButton icon="edit-2" iconSize={2} onClick={toggleEditMode} right={8} top={15} /> ) : ( <Fragment> <IconButton icon="check-circle" iconSize={2} onClick={saveChanges} right={36} top={15} /> <IconButton icon="x-circle" iconSize={2} onClick={toggleEditMode} right={8} top={15} /> </Fragment> )} <Row alignItems="center" justify="flex-start"> <H3>{isNumber(listIndex) ? `#${listIndex + 1} Author` : 'Author'}</H3> {!editMode ? ( <AuthorTags> {isSubmitting && <Tag>Submitting</Tag>} {isCorresponding && <Tag>Corresponding</Tag>} </AuthorTags> ) : ( <ValidatedField component={({ value, onChange }) => ( <Checkbox checked={value} label="Set corresponding" onChange={onChange} value={value} /> )} name="isCorresponding" /> )} </Row> </Fragment> ) // #endregion // #region AuthorEdit const AuthorEdit = ({ author, editMode, listIndex, handleSubmit, toggleEditMode, }) => ( <Fragment> <AuthorTitle editMode={editMode} isCorresponding={author.isCorresponding} isSubmitting={author.isSubmitting} listIndex={listIndex} saveChanges={handleSubmit} toggleEditMode={toggleEditMode} /> <Row> <Item vertical withRightMargin> <Label required>Email</Label> <ValidatedField component={TextField} name="email" validate={[required]} /> </Item> <Item vertical withRightMargin> <Label required>First name</Label> <ValidatedField component={TextField} name="firstName" validate={[required]} /> </Item> <Item vertical withRightMargin> <Label required>Last name</Label> <ValidatedField component={TextField} name="lastName" validate={[required]} /> </Item> <Item vertical> <Label required>Affiliation</Label> <ValidatedField component={TextField} name="affiliation" validate={[required]} /> </Item> </Row> </Fragment> ) // #endregion const EnhancedAuthorEdit = compose( reduxForm({ form: 'author-edit', onSubmit: values => {}, }), )(AuthorEdit) const Author = ({ author, listIndex, toggleEditMode }) => ( <Fragment> <AuthorTitle isCorresponding={author.isCorresponding} isSubmitting={author.isSubmitting} listIndex={listIndex} toggleEditMode={toggleEditMode} /> <PersonInfo person={author} /> </Fragment> ) const AuthorCard = ({ editMode, toggleEditMode, listIndex = null, author }) => ( <Root> {editMode ? ( <EnhancedAuthorEdit author={author} editMode={editMode} listIndex={listIndex} toggleEditMode={toggleEditMode} /> ) : ( <Author author={author} editMode={editMode} listIndex={listIndex} toggleEditMode={toggleEditMode} /> )} </Root> ) export default compose( withStateHandlers( { editMode: false }, { toggleEditMode: ({ editMode }, { onEdit }) => () => { onEdit() return { editMode: !editMode, } }, }, ), setDisplayName('AuthorCard'), )(AuthorCard) // #region styles const AuthorTags = styled.div` align-items: center; display: flex; ${Tag} { margin-right: ${th('gridUnit')}; } ` const Root = styled.div` border-radius: ${th('borderRadius')}; box-shadow: ${th('boxShadow')}; padding: calc(${th('gridUnit')} * 2); margin-bottom: ${th('gridUnit')}; position: relative; ${Row} { margin-bottom: ${th('gridUnit')}; } ${H3} { margin: 0; margin-right: ${th('gridUnit')}; } ` // #endregion