import { SubmissionError } from 'redux-form' import { pick, omit, get, isBoolean, replace } from 'lodash' import { update, create } from 'pubsweet-client/src/helpers/api' const generatePasswordHash = () => Array.from({ length: 4 }, () => Math.random() .toString(36) .slice(4), ).join('') 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 onSubmit = ( values, dispatch, { edit, setFetching, getUsers, hideModal, setModalError }, ) => { setFetching(true) if (!edit) { const newValues = setAdmin(values) return create('/users', newValues) .then(r => { create(`/emails`, { email: r.email, type: 'invite', role: values.role, }) setFetching(false) getUsers() hideModal() }) .catch(e => { setFetching(false) setModalError('Something went wrong...') }) } return update(`/users/${values.id}`, parseUpdateUser(values)) .then(() => { setFetching(false) getUsers() hideModal() }) .catch(e => { setFetching(false) setModalError('Something went wrong...') }) }