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

import {
  Row,
  Item,
  Label,
  DragHandle,
  AuthorCard,
  ActionLink,
  SortableList,
const castToBool = author => ({
  ...author,
  isCorresponding: isBoolean(author.isCorresponding) && author.isCorresponding,
})

const setCorrespondingAuthor = authors => {
  const corresponding = authors.find(a => a.isCorresponding)
  return corresponding
    ? authors
    : authors.map(
        a =>
          a.isSubmitting
            ? {
                ...a,
                isCorresponding: true,
              }
            : a,
      )
}

const parseEditedAuthors = (editedAuthor, authors) => {
  const newAuthor = castToBool(editedAuthor)
  const newAuthors = authors.map(
    a =>
      a.id === newAuthor.id
        ? newAuthor
        : {
            ...a,
            isCorresponding: newAuthor.isCorresponding
              ? false
              : a.isCorresponding,
          },
  )
  return setCorrespondingAuthor(newAuthors)
const WizardAuthors = ({
  addNewAuthor,
  setAuthorEdit,
  saveNewAuthor,
  editExistingAuthor,
  authorEditorSubmit,
    <Row alignItems="center" justify="flex-start">
      <Item>
        <Label>Authors</Label>
        <ActionLink icon="plus" onClick={addNewAuthor}>
          ADD AUTHOR
        </ActionLink>
      </Item>
      <Item justify="flex-end">
        <ActionLink
          icon="link"
          iconPosition="right"
            'submission.links.authorGuidelines',
            'https://www.hindawi.com/journals/',
          )}
        </ActionLink>
      </Item>
    </Row>
    {authors.length > 0 && (
      <SortableContainer>
        <SortableList
          authorEditorSubmit={authorEditorSubmit}
          dragHandle={DragHandle}
          editExistingAuthor={editExistingAuthor}
          isAuthorsFetching={isAuthorsFetching}
          itemKey="id"
          items={authors}
          listItem={AuthorCard}
          moveItem={moveAuthor}
          onEdit={setAuthorEdit}
          saveNewAuthor={saveNewAuthor}
        />
      </SortableContainer>
    )}
      <Row justify="flex-start" mb={1} mt={1}>
        <Text error>{error}</Text>
      </Row>
    )}
  </Fragment>
)

export default compose(
  withState('authors', 'setAuthors', ({ authors }) => authors),
  withHandlers({
    setFormAuthors: ({
      changeForm,
      setAuthors,
      setFetching,
      onAuthorEdit,
      formName = 'submission',
    }) => authors => {
      onAuthorEdit(null)
      changeForm(formName, 'authors', authors)
    addNewAuthor: ({ authors = [], setAuthors, onAuthorEdit }) => () => {
      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, onAuthorEdit }) => index => {
      onAuthorEdit(index)
      setAuthors(authors.filter(a => a.id !== 'newAuthor'))
    },
    saveNewAuthor: ({ authors, setFormAuthors }) => author => {
      setFormAuthors(
        parseEditedAuthors(author, [
          ...authors.filter(a => a.id !== 'newAuthor'),
          author,
        ]),
      )
    editExistingAuthor: ({ authors, setFormAuthors }) => editedAuthor => {
      const newAuthors = parseEditedAuthors(editedAuthor, authors)
      setFormAuthors(newAuthors)
    deleteAuthor: ({
      authors,
      project,
      version,
      deleteAuthor,
      setFormAuthors,
    }) => author => ({ hideModal, setModalError }) =>
      deleteAuthor(project.id, version.id, author.id)
        .then(() => {
          const newAuthors = setCorrespondingAuthor(
            authors.filter(a => a.id !== author.id),
          )
          setFormAuthors(newAuthors)
    authorEditorSubmit: ({
      authors,
      project,
      version,
      addAuthor,
      saveNewAuthor,
      editExistingAuthor,
    }) => (values, dispatch, { toggleEditMode }) => {
      if (values.id === 'newAuthor') {
          },
          project.id,
          version.id,
        ).then(saveNewAuthor)
      editExistingAuthor(values)
      setTimeout(toggleEditMode, 10)
    },
  }),
)(WizardAuthors)

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