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', notifications: { email: { system: true, user: true, }, }, } } 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: `${user.isActive === false ? 'Reactivate' : 'Deactivate'} user?`, subtitle: user.email, confirmText: 'Confirm', onConfirm: () => { updateUserStatus(user).then(() => { dispatch(actions.getUsers()) hideModal() }, handleError(setModalError)) }, onCancel: hideModal, })