Skip to content
Snippets Groups Projects
utils.js 2.97 KiB
Newer Older
import {
  set,
  get,
  omit,
  pick,
  isEqual,
  isEmpty,
  debounce,
  isBoolean,
} from 'lodash'
import { handleError } from 'pubsweet-component-faraday-ui'

import {
  autosaveRequest,
  autosaveSuccess,
  autosaveFailure,
} from '../redux/autosave'
import { SubmissionStatement } from './'
export const setInitialValues = ({ version }) => ({
  initialValues: {
    files: get(version, 'files', {}),
    authors: get(version, 'authors', []),
    metadata: get(version, 'metadata', {}),
    conflicts: get(version, 'conflicts', {
      hasConflicts: 'no',
    declarations: get(version, 'declarations', { agree: false }),
  },
})

export const validate = (values, props) => {
  const errors = {}

  if (!get(values, 'declarations.agree')) {
    set(errors, 'declarations.agree', 'Required')
  }

  if (isEmpty(get(values, 'authors', []))) {
    errors.authors = 'Authors are required.'
  }

  if (!isBoolean(values.authorForm) && values.authorForm > -1) {
    errors.authors = 'You have an unsaved author.'
  }

  if (isBoolean(values.authorForm) && values.authorForm) {
    errors.authors = 'Finish or cancel adding a new author.'
  }

  if (isEmpty(get(values, 'files.manuscripts', []))) {
    errors.files = 'At least one manuscript file is required.'
  }

  return errors
}
const _onChange = (values, dispatch, { project, version, updateFragment }) => {
  const previousValues = pick(version, [
    'files',
    'authors',
    'metadata',
    'conflicts',
    'declarations',
  ])
  const newValues = omit(values, ['agree', 'authorForm'])
  if (!isEqual(newValues, previousValues)) {
    dispatch(autosaveRequest())
    updateFragment(project, {
      ...version,
      ...newValues,
    }).then(
      () => dispatch(autosaveSuccess()),
      () => dispatch(autosaveFailure()),
    )
  }
}

export const onChange = debounce(_onChange, 1000, { maxWait: 5000 })

export const onSubmit = (
  values,
  dispatch,
  {
    step,
    history,
    nextStep,
    showModal,
    hideModal,
    submitManuscript,
    version: { id: fragmentId },
    project: { id: collectionId, customId },
  },
) => {
  if (step !== 2) {
    nextStep()
    showModal({
      title:
        'By submitting the manuscript, you agree to the following statements:',
      confirmText: 'AGREE & SUBMIT',
      cancelText: 'BACK TO SUBMISSION',
      onConfirm: () => {
        dispatch(autosaveRequest())
        submitManuscript(collectionId, fragmentId)
          .then(r => {
            dispatch(autosaveSuccess())
            history.push('/confirmation-page', {
              customId,
              version: fragmentId,
              project: collectionId,
            })
          })
      onCancel: hideModal,
    })