-
Bogdan Cochior authoredee4f999c
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
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,
})