@@ -3,11 +3,13 @@ import { Dialog, DialogActions, DialogContent, DialogTitle, TextField, MenuItem,
33import { UserRequest } from './UserManagement' ;
44import { useUserList } from 'services/user' ;
55import { User } from './UserManagement' ;
6+ import { useAlert } from 'contexts/AlertContextProvider' ;
7+ import Alert from '@mui/material/Alert' ;
68
79interface AddUserProps {
810 open : boolean ;
911 onClose : ( ) => void ;
10- onSubmit : ( newUser : UserRequest ) => void ;
12+ onSubmit : ( newUser : UserRequest ) => Promise < void > ;
1113 currentUser : User ;
1214}
1315
@@ -25,17 +27,16 @@ const emailRegex = /^[\w.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
2527const AddUser : React . FC < AddUserProps > = ( { open, onClose, onSubmit, currentUser } ) => {
2628 const [ newUser , setNewUser ] = useState < UserRequest > ( {
2729 user_name : '' ,
28- first_name : '' ,
29- last_name : '' ,
3030 email_address : '' ,
3131 password : '' ,
3232 roles : [ 'viewer' ] ,
33- status : 'active' ,
3433 } ) ;
3534
3635 const [ isUsernameTaken , setIsUsernameTaken ] = useState < boolean | null > ( null ) ;
3736 const [ isEmailTaken , setIsEmailTaken ] = useState < boolean | null > ( null ) ;
3837 const { data : users } = useUserList ( ) ;
38+ const { showAlert } = useAlert ( ) ;
39+ const [ error , setError ] = useState < boolean | null > ( null ) ;
3940
4041 useEffect ( ( ) => {
4142 const userName = newUser ?. user_name . replace ( / \s + / g, '_' ) ;
@@ -71,36 +72,61 @@ const AddUser: React.FC<AddUserProps> = ({ open, onClose, onSubmit, currentUser
7172 } ;
7273
7374 const handleSubmit = ( ) => {
74- setTimeout ( ( ) => {
75- onSubmit ( newUser ) ;
76- onClose ( ) ;
77- setNewUser ( {
78- user_name : '' ,
79- first_name : '' ,
80- last_name : '' ,
81- email_address : '' ,
82- roles : [ 'viewer' ] ,
83- status : 'active' ,
84- password : ''
75+ onSubmit ( newUser )
76+ . then ( ( ) => {
77+ onClose ( ) ;
78+ resetForm ( ) ;
79+ } )
80+ . catch ( ( ) => {
81+ showAlert ( 'Failed to create user' , 'error' ) ;
82+ setError ( true ) ;
8583 } ) ;
86- } , 1000 ) ;
84+ } ;
85+
86+
87+ const resetForm = ( ) => {
88+ setNewUser ( {
89+ user_name : '' ,
90+ email_address : '' ,
91+ roles : [ 'viewer' ] ,
92+ password : '' ,
93+ } ) ;
8794 } ;
8895
89- const isEmailValid = newUser . email_address ? emailRegex . test ( newUser . email_address ) : true ;
96+ const isEmailValid = newUser ?. email_address ? emailRegex . test ( newUser ?. email_address ) : true ;
97+ const isFirstNameValid = ! newUser . first_name || newUser . first_name . length >= 3 ;
98+ const isLastNameValid = ! newUser . last_name || newUser . last_name . length >= 3 ;
9099 const isFormValid =
91- newUser . user_name &&
92- newUser . email_address &&
93- newUser . password &&
94- newUser . roles . length > 0 &&
100+ newUser ? .user_name &&
101+ newUser ? .email_address &&
102+ newUser ? .password &&
103+ newUser ? .roles . length > 0 &&
95104 isUsernameTaken === false &&
96- isEmailTaken === false &&
97- isEmailValid ;
105+ isEmailValid &&
106+ isFirstNameValid &&
107+ isLastNameValid ;
98108
99109 const availableRoles = currentUser ?. is_owner ? rolesOptions : rolesOptions . filter ( role => role . value !== 'admin' ) ;
100110
111+ const handleCancel = ( ) => {
112+ setError ( null ) ;
113+ resetForm ( ) ;
114+ onClose ( ) ;
115+ } ;
116+
117+ const handleDialogClose = ( event : React . SyntheticEvent , reason : string ) => {
118+ if ( reason && ( reason !== 'backdropClick' ) ) {
119+ onClose ( ) ;
120+ }
121+ } ;
122+
101123 return (
102- < Dialog open = { open } onClose = { onClose } >
124+ < Dialog
125+ open = { open }
126+ onClose = { handleDialogClose }
127+ >
103128 < DialogTitle > Create New User</ DialogTitle >
129+ { error && < Alert severity = "error" > Failed to create User</ Alert > }
104130 < DialogContent >
105131 < TextField
106132 label = "User Name"
@@ -122,6 +148,8 @@ const AddUser: React.FC<AddUserProps> = ({ open, onClose, onSubmit, currentUser
122148 value = { newUser . first_name }
123149 onChange = { handleChange }
124150 margin = "normal"
151+ error = { ! isFirstNameValid }
152+ helperText = { ! isFirstNameValid ? 'If provided, first name must be at least 3 characters' : '' }
125153 />
126154 < TextField
127155 label = "Last Name"
@@ -131,6 +159,8 @@ const AddUser: React.FC<AddUserProps> = ({ open, onClose, onSubmit, currentUser
131159 value = { newUser . last_name }
132160 onChange = { handleChange }
133161 margin = "normal"
162+ error = { ! isLastNameValid }
163+ helperText = { ! isLastNameValid ? 'If provided, last name must be at least 3 characters' : '' }
134164 />
135165 < TextField
136166 label = "Email"
@@ -175,7 +205,7 @@ const AddUser: React.FC<AddUserProps> = ({ open, onClose, onSubmit, currentUser
175205 </ FormControl >
176206 </ DialogContent >
177207 < DialogActions >
178- < Button onClick = { onClose } color = "primary" variant = 'outlined' size = 'small' >
208+ < Button onClick = { handleCancel } color = "primary" variant = 'outlined' size = 'small' >
179209 Cancel
180210 </ Button >
181211 < Button onClick = { handleSubmit } color = "primary" variant = 'contained' size = 'small' disabled = { ! isFormValid } >
0 commit comments