Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
files.js 2.12 KiB
import request, { remove } from 'pubsweet-client/src/helpers/api'

const initialState = {
  isFetching: false,
  error: null,
  files: {
    manuscripts: [],
    supplementary: [],
    coverLetter: [],
  },
}

const UPLOAD_REQUEST = 'files/UPLOAD_REQUEST'
const UPLOAD_FAILURE = 'files/UPLOAD_FAILURE'
const UPLOAD_SUCCESS = 'files/UPLOAD_SUCCESS'

const REMOVE_REQUEST = 'files/REMOVE_REQUEST'
const REMOVE_FAILURE = 'files/REMOVE_FAILURE'
const REMOVE_SUCCESS = 'files/REMOVE_SUCCESS'

const SET_FILES = 'files/SET_FILES'

export const setFiles = (files, fileType) => ({
  type: SET_FILES,
  files,
  fileType,
})

const uploadRequest = () => ({
  type: UPLOAD_REQUEST,
})

const uploadFailure = error => ({
  type: UPLOAD_FAILURE,
  error,
})

const uploadSuccess = () => ({
  type: UPLOAD_SUCCESS,
})

const createFileData = (file, type) => {
  const data = new FormData()
  data.append('file', file)
  data.append('fileType', type)

  return {
    method: 'POST',
    headers: {
      Accept: 'text/plain',
    },
    body: data,
  }
}

const removeRequest = () => ({
  type: REMOVE_REQUEST,
})

export const getFiles = state => state.files.files

export const uploadFile = (file, type) => dispatch => {
  dispatch(uploadRequest())
  return request('/aws-upload', createFileData(file, type))
    .then(r => {
      dispatch(uploadSuccess())
      return r
    })
    .catch(err => dispatch(uploadFailure(err.message)))
}

export const deleteFile = fileId => dispatch => {
  dispatch(removeRequest())
  return remove(`/aws-delete/${fileId}`)
}

export default (state = initialState, action) => {
  switch (action.type) {
    case UPLOAD_REQUEST:
      return {
        ...state,
        isFetching: true,
        error: null,
      }
    case SET_FILES:
      return {
        ...state,
        files: {
          ...state.files,
          [action.fileType]: action.files,
        },
      }
    case UPLOAD_FAILURE:
      return {
        ...state,
        isFetching: false,
        error: action.error,
      }
    case UPLOAD_SUCCESS:
      return {
        ...state,
        isFetching: false,
        error: null,
      }
    default:
      return state
  }
}