Skip to content
Snippets Groups Projects
WizardAuthors.js 3.3 KiB
Newer Older
import React, { Fragment } from 'react'
import { omit } from 'lodash'
import styled from 'styled-components'
import { th } from '@pubsweet/ui-toolkit'
import { compose, withState, withHandlers } from 'recompose'

import {
  Row,
  Item,
  Label,
  DragHandle,
  AuthorCard,
  ActionLink,
  SortableList,
} from './'

const WizardAuthors = ({
  moveAuthor,
  addNewAuthor,
  setAuthorEdit,
  saveNewAuthor,
  editExistingAuthor,
  authorEditorSubmit,
}) => (
  <Fragment>
    <Row alignItems="center" justify="flex-start" pl={1} pr={1}>
      <Item>
        <Label>Authors</Label>
        <ActionLink icon="plus" onClick={addNewAuthor}>
          ADD AUTHOR
        </ActionLink>
      </Item>
      <Item justify="flex-end">
        <ActionLink
          icon="link"
          iconPosition="right"
          to="https://www.hindawi.com/journals/jl/guidelines/"
        >
          Journal Author Submission Guidelines
        </ActionLink>
      </Item>
    </Row>
    {authors.length > 0 && (
      <SortableContainer>
        <SortableList
          authorEditorSubmit={authorEditorSubmit}
          dragHandle={DragHandle}
          editExistingAuthor={editExistingAuthor}
          itemKey="id"
          items={authors}
          listItem={AuthorCard}
          moveItem={moveAuthor}
          onEdit={setAuthorEdit}
          saveNewAuthor={saveNewAuthor}
        />
      </SortableContainer>
    )}
  </Fragment>
)

export default compose(
  withState('authors', 'setAuthors', ({ authors }) => authors),
  withHandlers({
    setFormAuthors: ({ changeForm, setAuthors }) => authors => {
      setAuthors(authors)
      changeForm('submission', 'authors', authors)
    },
  }),
  withHandlers({
    addNewAuthor: ({ authors, setAuthors }) => () => {
      if (authors.some(a => a.id === 'newAuthor')) {
        return
      }
      setAuthors([
        ...authors,
        { id: 'newAuthor', isCorresponding: false, isSubmitting: false },
      ])
    moveAuthor: ({ authors, setFormAuthors }) => (dragIndex, hoverIndex) => {
      setFormAuthors(SortableList.moveItem(authors, dragIndex, hoverIndex))
    },
    setAuthorEdit: ({ authors, setAuthors }) => index => {
      setAuthors(authors.filter(a => a.id !== 'newAuthor'))
    },
    saveNewAuthor: ({ authors, setFormAuthors }) => author => {
      setFormAuthors([...authors.filter(a => a.id !== 'newAuthor'), author])
    editExistingAuthor: ({ authors, setFormAuthors }) => editedAuthor => {
      setFormAuthors(
        authors.map(a => (a.id === editedAuthor.id ? editedAuthor : a)),
    authorEditorSubmit: ({
      authors,
      project,
      version,
      addAuthor,
      saveNewAuthor,
      editExistingAuthor,
    }) => (values, dispatch, { toggleEditMode }) => {
      if (values.id === 'newAuthor') {
        addAuthor(
          {
            ...omit(values, 'id'),
            isSubmitting: authors.length === 0,
          },
          project.id,
          version.id,
        ).then(saveNewAuthor)
      } else {
        editExistingAuthor(values)
        setTimeout(toggleEditMode, 10)
      }
    },
  }),
)(WizardAuthors)

// #region styles
const SortableContainer = styled.div`
  background-color: ${th('colorBackground')};
  border-radius: ${th('borderRadius')};
  padding: ${th('gridUnit')};