Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
utils.js 2.69 KiB
import { actions } from 'pubsweet-client'
import { SubmissionError } from 'redux-form'
import { update } from 'pubsweet-client/src/helpers/api'
import { pick, map, omit, get, isBoolean, replace } from 'lodash'

import { handleError } from '../utils'

const generatePasswordHash = () =>
  Array.from({ length: 4 }, () =>
    Math.random()
      .toString(36)
      .slice(4),
  ).join('')

export const getRoleOptions = journal =>
  map(journal.roles, (value, key) => ({ label: value, value: key }))

export const setAdmin = values => {
  const newValues = { ...values }
  if (newValues.roles && newValues.roles.includes('admin')) {
    newValues.admin = true
  } else {
    newValues.admin = false
  }

  return {
    ...omit(newValues, ['role']),
    username: newValues.email,
    isConfirmed: false,
    passwordResetToken: generatePasswordHash(),
    password: 'defaultpass',
    editorInChief: newValues.role === 'editorInChief',
    handlingEditor: newValues.role === 'handlingEditor',
  }
}

export const parseUpdateUser = values => {
  const parsedValues = {
    ...values,
    editorInChief: values.editorInChief || false,
    handlingEditor: values.handlingEditor || false,
    admin: values.admin || false,
  }
  const valuesToSave = [
    'admin',
    'firstName',
    'lastName',
    'affiliation',
    'title',
    'roles',
    'editorInChief',
    'handlingEditor',
    'isActive',
    'username',
  ]

  return pick(parsedValues, valuesToSave)
}

export const handleFormError = error => {
  const err = get(error, 'response')
  if (err) {
    const errorMessage =
      get(JSON.parse(err), 'error') || get(JSON.parse(err), 'message')
    throw new SubmissionError({
      _error: errorMessage || 'Something went wrong',
    })
  }
}
const toggleUserStatus = user => {
  const { isActive, username } = user
  let newState = true
  let newUsername = ''

  if (!isBoolean(isActive) || isActive) {
    newState = false
    newUsername = `invalid***${username}`
  } else {
    newUsername = replace(username, 'invalid***', '')
  }

  return {
    ...user,
    isActive: newState,
    username: newUsername,
  }
}

export const updateUserStatus = user => {
  const updatedUser = toggleUserStatus(user)
  return update(`/users/${user.id}`, parseUpdateUser(updatedUser))
}

export const updateUserStatusModal = ({
  user,
  showModal,
  hideModal,
  setModalError,
  dispatch,
}) =>
  showModal({
    title: 'Are you sure?',
    subtitle: `${user.isActive === false ? 'Activate ' : 'Deactivate '}${
      user.email
    }.`,
    confirmText: 'Confirm',
    onConfirm: () => {
      updateUserStatus(user).then(() => {
        dispatch(actions.getUsers())
        hideModal()
      }, handleError(setModalError))
    },
    onCancel: hideModal,
  })