import { Field, Box, Button } from '@rocket.chat/fuselage';
import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
import { useEndpoint, useRoute, useSetting, useTranslation } from '@rocket.chat/ui-contexts';
import { useQuery } from '@tanstack/react-query';
import React, { useMemo, useCallback, useState } from 'react';
import { parseCSV } from '../../../../lib/utils/parseCSV';
import { useEndpointAction } from '../../../hooks/useEndpointAction';
import { useForm } from '../../../hooks/useForm';
import UserForm from './UserForm';
import { useSmtpConfig } from './hooks/useSmtpConfig';
const AddUser = ({ onReload, ...props }) => {
const t = useTranslation();
const router = useRoute('admin-users');
const getRoleData = useEndpoint('GET', '/v1/roles.list');
const { data } = useQuery(['roles'], async () => {
const roles = await getRoleData();
return roles;
});
const isSmtpEnabled = useSmtpConfig();
const [errors, setErrors] = useState({});
const validationKeys = {
name: (name) =>
setErrors((errors) => ({
...errors,
name: !name.trim().length ? t('The_field_is_required', t('name')) : undefined,
})),
username: (username) =>
setErrors((errors) => ({
...errors,
username: !username.trim().length ? t('The_field_is_required', t('username')) : undefined,
})),
email: (email) =>
setErrors((errors) => ({
...errors,
email: !email.trim().length ? t('The_field_is_required', t('email')) : undefined,
})),
password: (password, values) =>
setErrors((errors) => ({
...errors,
password: !password.trim().length && !values.setRandomPassword ? t('The_field_is_required', t('password')) : undefined,
})),
setRandomPassword: (setRandomPassword, values) =>
setErrors((errors) => ({
...errors,
password: !values.password.trim().length && !setRandomPassword ? t('The_field_is_required', t('password')) : undefined,
})),
};
const validateForm = ({ key, value, values }) => {
validationKeys[key] && validationKeys[key](value, values);
};
const defaultUserRoles = parseCSV(String(useSetting('Accounts_Registration_Users_Default_Roles')));
const { values, handlers, reset, hasUnsavedChanges } = useForm(
{
roles: defaultUserRoles,
name: '',
username: '',
statusText: '',
bio: '',
nickname: '',
email: '',
password: '',
verified: false,
requirePasswordChange: false,
setRandomPassword: false,
sendWelcomeEmail: isSmtpEnabled,
joinDefaultChannels: true,
customFields: {},
},
validateForm,
);
const goToUser = useCallback(
(id) =>
router.push({
context: 'info',
id,
}),
[router],
);
const saveAction = useEndpointAction('POST', '/v1/users.create', { successMessage: t('User_created_successfully!') });
const eventStats = useEndpointAction('POST', '/v1/statistics.telemetry');
const handleSave = useMutableCallback(async () => {
Object.entries(values).forEach(([key, value]) => {
validateForm({ key, value, values });
});
const { name, username, password, email, setRandomPassword } = values;
if (name === '' || username === '' || email === '') {
return false;
}
if (password === '' && setRandomPassword === false) {
return false;
}
const result = await saveAction(values);
if (result.success) {
eventStats({
params: [{ eventName: 'updateCounter', settingsId: 'Manual_Entry_User_Count' }],
});
goToUser(result.user._id);
onReload();
}
});
const availableRoles = useMemo(() => data?.roles?.map(({ _id, description, name }) => [_id, description || name]) ?? [], [data]);
const append = useMemo(
() => (
),
[hasUnsavedChanges, reset, t, handleSave],
);
return (
);
};
export default AddUser;