diff --git a/web-console-v2/src/pages/UserManagement/AddUser.tsx b/web-console-v2/src/pages/UserManagement/AddUser.tsx index 50c0286e..7ce09c6d 100644 --- a/web-console-v2/src/pages/UserManagement/AddUser.tsx +++ b/web-console-v2/src/pages/UserManagement/AddUser.tsx @@ -3,11 +3,13 @@ import { Dialog, DialogActions, DialogContent, DialogTitle, TextField, MenuItem, import { UserRequest } from './UserManagement'; import { useUserList } from 'services/user'; import { User } from './UserManagement'; +import { useAlert } from 'contexts/AlertContextProvider'; +import Alert from '@mui/material/Alert'; interface AddUserProps { open: boolean; onClose: () => void; - onSubmit: (newUser: UserRequest) => void; + onSubmit: (newUser: UserRequest) => Promise; currentUser: User; } @@ -25,17 +27,16 @@ const emailRegex = /^[\w.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; const AddUser: React.FC = ({ open, onClose, onSubmit, currentUser }) => { const [newUser, setNewUser] = useState({ user_name: '', - first_name: '', - last_name: '', email_address: '', password: '', roles: ['viewer'], - status: 'active', }); const [isUsernameTaken, setIsUsernameTaken] = useState(null); const [isEmailTaken, setIsEmailTaken] = useState(null); const { data: users } = useUserList(); + const { showAlert } = useAlert(); + const [error, setError] = useState(null); useEffect(() => { const userName = newUser?.user_name.replace(/\s+/g, '_'); @@ -71,36 +72,61 @@ const AddUser: React.FC = ({ open, onClose, onSubmit, currentUser }; const handleSubmit = () => { - setTimeout(() => { - onSubmit(newUser); - onClose(); - setNewUser({ - user_name: '', - first_name: '', - last_name: '', - email_address: '', - roles: ['viewer'], - status: 'active', - password: '' + onSubmit(newUser) + .then(() => { + onClose(); + resetForm(); + }) + .catch(() => { + showAlert('Failed to create user', 'error'); + setError(true); }); - }, 1000); + }; + + + const resetForm = () => { + setNewUser({ + user_name: '', + email_address: '', + roles: ['viewer'], + password: '', + }); }; - const isEmailValid = newUser.email_address ? emailRegex.test(newUser.email_address) : true; + const isEmailValid = newUser?.email_address ? emailRegex.test(newUser?.email_address) : true; + const isFirstNameValid = !newUser.first_name || newUser.first_name.length >= 3; + const isLastNameValid = !newUser.last_name || newUser.last_name.length >= 3; const isFormValid = - newUser.user_name && - newUser.email_address && - newUser.password && - newUser.roles.length > 0 && + newUser?.user_name && + newUser?.email_address && + newUser?.password && + newUser?.roles.length > 0 && isUsernameTaken === false && - isEmailTaken === false && - isEmailValid; + isEmailValid && + isFirstNameValid && + isLastNameValid; const availableRoles = currentUser?.is_owner ? rolesOptions : rolesOptions.filter(role => role.value !== 'admin'); + const handleCancel = () => { + setError(null); + resetForm(); + onClose(); + }; + + const handleDialogClose = (event: React.SyntheticEvent, reason: string) => { + if (reason && (reason !== 'backdropClick')) { + onClose(); + } + }; + return ( - + Create New User + {error && Failed to create User} = ({ open, onClose, onSubmit, currentUser value={newUser.first_name} onChange={handleChange} margin="normal" + error={ !isFirstNameValid} + helperText={!isFirstNameValid ? 'If provided, first name must be at least 3 characters' : ''} /> = ({ open, onClose, onSubmit, currentUser value={newUser.last_name} onChange={handleChange} margin="normal" + error={!isLastNameValid} + helperText={!isLastNameValid ? 'If provided, last name must be at least 3 characters' : ''} /> = ({ open, onClose, onSubmit, currentUser -