import React, { useState, useCallback, useRef, useEffect } from 'react'; import cx from 'classnames'; import SolidIcon from '@/_ui/Icon/SolidIcons'; import { ToolTip } from '@/_components/ToolTip'; import { useTranslation } from 'react-i18next'; import { ButtonSolid } from '@/_ui/AppButton/AppButton'; import { toast } from 'react-hot-toast'; import { FileDropzone } from './FileDropzone'; import { USER_DRAWER_MODES } from '@/_helpers/utils'; import { UserGroupsSelect } from './UserGroupsSelect'; function InviteUsersForm({ onClose, manageUser, changeNewUserOption, errors, fields, handleFileChange, uploadingUsers, onCancel, inviteBulkUsers, groups = [], currentEditingUser, userDrawerMode, setUserValues, creatingUser, }) { const { t } = useTranslation(); const [activeTab, setActiveTab] = useState(1); const [selectedGroups, setSelectedGroups] = useState([]); const [existingGroups, setExistingGroups] = useState([]); const customGroups = groups.filter((group) => group.groupType === 'custom'); const roleGroups = groups.filter((group) => group.groupType === 'default'); const groupedOptions = [ { label: 'default', options: roleGroups, }, { label: 'custom', options: customGroups, }, ]; const hiddenFileInput = useRef(null); useEffect(() => { if (currentEditingUser && groups.length) { const { first_name, last_name, email, groups: addedToCustomGroups, role_group } = currentEditingUser; const addedToGroups = [...addedToCustomGroups, ...role_group]; setUserValues({ fullName: `${first_name}${last_name && ` ${last_name}`}`, email: email, }); const preSelectedGroups = groups .filter((group) => addedToGroups.map((group) => group.name).includes(group.value)) .map((filteredGroup) => ({ ...filteredGroup, label: filteredGroup.name, })); setExistingGroups( groups.filter((group) => addedToCustomGroups.map((gp) => gp.name).includes(group.value)).map((g) => g.id) ); onChangeHandler(preSelectedGroups); } }, [currentEditingUser, groups]); const onDrop = useCallback((acceptedFiles) => { const file = acceptedFiles[0]; if (Math.round(file.size / 1024) > 1024) { toast.error('File size cannot exceed more than 1MB'); } else { handleFileChange(file); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const handleClick = () => { hiddenFileInput.current.click(); }; const onChangeHandler = (items) => { let finalGroup = items; const roleGroups = items.filter((group) => group.groupType === 'default'); const currentRole = selectedGroups.find((group) => group.groupType === 'default'); if (roleGroups.length == 2) { finalGroup = items.filter((group) => group.value !== currentRole.value); } setSelectedGroups(finalGroup); }; const handleCreateUser = (e) => { e.preventDefault(); const role = selectedGroups.find((group) => group.groupType === 'default').value; const selectedGroupsIds = selectedGroups.filter((group) => group.groupType !== 'default').map((group) => group.id); manageUser(currentEditingUser?.id, selectedGroupsIds, role); }; const handleEditUser = (e) => { e.preventDefault(); const { newGroupsToAdd, groupsToRemove, selectedGroupsIds, role } = getEditedGroups(); manageUser(currentEditingUser.id, selectedGroupsIds, role, newGroupsToAdd, groupsToRemove); }; const getEditedGroups = () => { let role = null; if (currentEditingUser) role = selectedGroups.find( (group) => group.groupType === 'default' && !currentEditingUser.role_group.map((role) => role.name).includes(group.value) )?.value; const selectedGroupsIds = selectedGroups.filter((group) => group.groupType !== 'default').map((group) => group.id); const newGroupsToAdd = selectedGroupsIds.filter((selectedGroupId) => !existingGroups.includes(selectedGroupId)); const groupsToRemove = existingGroups.filter((existingGroup) => !selectedGroupsIds.includes(existingGroup)); return { newGroupsToAdd, groupsToRemove, selectedGroupsIds, role }; }; const isEdited = () => { const { newGroupsToAdd, groupsToRemove, role } = getEditedGroups(); const { first_name, last_name } = currentEditingUser || {}; return isEditing ? fields['fullName'] !== `${first_name}${last_name && ` ${last_name}`}` || groupsToRemove.length || role !== undefined || newGroupsToAdd.length : true; }; const isEditing = userDrawerMode === USER_DRAWER_MODES.EDIT; const containRoleGroup = selectedGroups.filter((item) => ['admin', 'end-user', 'builder'].includes(item.value)).length > 0; return (

{!isEditing ? t('header.organization.menus.manageUsers.addNewUser', 'Add new user') : 'Edit user details'}

{ onCancel(); onClose(); }} style={{ cursor: 'pointer' }} data-cy="close-button" >
{!isEditing && (
)}
{activeTab == 1 ? (
{errors['fullName']}
{errors['email']}
) : (

Download the ToolJet template to add user details or format your file in the same as the template. ToolJet won’t be able to recognise files in any other format.{' '}

Download Template
)}
{ onCancel(); onClose(); }} variant="tertiary" > {t('globals.cancel', 'Cancel')} {!isEditing ? activeTab == 1 ? t('header.organization.menus.manageUsers.inviteUsers', 'Invite Users') : 'Upload users' : 'Update'}
); } export default InviteUsersForm;