import LoadingButton from '@mui/lab/LoadingButton'; import Grid from '@mui/material/Grid'; import Stack from '@mui/material/Stack'; import Alert from '@mui/material/Alert'; import MuiTextField from '@mui/material/TextField'; import * as React from 'react'; import { useQueryClient } from '@tanstack/react-query'; import * as yup from 'yup'; import { yupResolver } from '@hookform/resolvers/yup'; import Can from 'components/Can'; import Container from 'components/Container'; import ControlledAutocomplete from 'components/ControlledAutocomplete'; import Form from 'components/Form'; import PageTitle from 'components/PageTitle'; import TextField from 'components/TextField'; import useFormatMessage from 'hooks/useFormatMessage'; import useRoles from 'hooks/useRoles.ee'; import useAdminCreateUser from 'hooks/useAdminCreateUser'; import useCurrentUserAbility from 'hooks/useCurrentUserAbility'; import { getGeneralErrorMessage } from 'helpers/errors'; function generateRoleOptions(roles) { return roles?.map(({ name: label, id: value }) => ({ label, value })); } const getValidationSchema = (formatMessage, canUpdateRole) => { const getMandatoryFieldMessage = (fieldTranslationId) => formatMessage('userForm.mandatoryInput', { inputName: formatMessage(fieldTranslationId), }); return yup.object().shape({ fullName: yup .string() .trim() .required(getMandatoryFieldMessage('userForm.fullName')), email: yup .string() .trim() .email(formatMessage('userForm.validateEmail')) .required(getMandatoryFieldMessage('userForm.email')), ...(canUpdateRole ? { roleId: yup .string() .required(getMandatoryFieldMessage('userForm.role')), } : {}), }); }; const defaultValues = { fullName: '', email: '', roleId: '', }; export default function CreateUser() { const formatMessage = useFormatMessage(); const { mutateAsync: createUser, isPending: isCreateUserPending, data: createdUser, isSuccess: createUserSuccess, } = useAdminCreateUser(); const { data: rolesData, loading: isRolesLoading } = useRoles(); const roles = rolesData?.data; const queryClient = useQueryClient(); const currentUserAbility = useCurrentUserAbility(); const canUpdateRole = currentUserAbility.can('update', 'Role'); const handleUserCreation = async (userData, e, setError) => { try { await createUser({ fullName: userData.fullName, email: userData.email, roleId: userData.roleId, }); queryClient.invalidateQueries({ queryKey: ['admin', 'users'] }); } catch (error) { const errors = error?.response?.data?.errors; if (errors) { const fieldNames = Object.keys(defaultValues); Object.entries(errors).forEach(([fieldName, fieldErrors]) => { if (fieldNames.includes(fieldName) && Array.isArray(fieldErrors)) { setError(fieldName, { type: 'fieldRequestError', message: fieldErrors.join(', '), }); } }); } const generalError = getGeneralErrorMessage({ error, fallbackMessage: formatMessage('createUser.error'), }); if (generalError) { setError('root.general', { type: 'requestError', message: generalError, }); } } }; return ( {formatMessage('createUserPage.title')}
( ( )} loading={isRolesLoading} showHelperText={false} /> {errors?.root?.general && ( {errors?.root?.general?.message} )} {createUserSuccess && ( {formatMessage('createUser.successfullyCreated')} )} {createdUser && ( {formatMessage('createUser.invitationEmailInfo', { link: () => ( {createdUser.data.acceptInvitationUrl} ), })} )} {formatMessage('createUser.submit')} )} /> ); }