@@ -12,7 +12,7 @@ interface TeamProps {
1212
1313export interface TeamMember {
1414 id : string ;
15- username : string ;
15+ email : string ;
1616 role ?: string ;
1717}
1818
@@ -35,9 +35,11 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
3535 } , [ initialData ] ) ;
3636
3737 const [ searchQuery , setSearchQuery ] = useState ( '' ) ;
38- const [ errors , setErrors ] = useState < { members ?: string } > ( { } ) ;
38+ const [ errors , setErrors ] = useState < { members ?: string ; email ?: string } > (
39+ { }
40+ ) ;
3941
40- const handleInputChange = (
42+ const handleFormDataChange = (
4143 field : keyof TeamFormData ,
4244 value : TeamMember [ ]
4345 ) => {
@@ -51,7 +53,12 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
5153 onDataChange ?.( newData ) ;
5254 } ;
5355
54- const addMember = ( username : string ) => {
56+ const isValidEmail = ( email : string ) : boolean => {
57+ const emailRegex = / ^ [ ^ \s @ ] + @ [ ^ \s @ ] + \. [ ^ \s @ ] + $ / ;
58+ return emailRegex . test ( email ) ;
59+ } ;
60+
61+ const addMember = ( email : string ) => {
5562 if ( formData . members . length >= 4 ) {
5663 setErrors ( prev => ( {
5764 ...prev ,
@@ -60,26 +67,47 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
6067 return ;
6168 }
6269
63- const trimmed = username . trim ( ) ;
64- if (
65- trimmed &&
66- ! formData . members . some ( member => member . username === trimmed )
67- ) {
68- const newMember : TeamMember = {
69- id : Date . now ( ) . toString ( ) ,
70- username : trimmed ,
71- role : 'MEMBER' ,
72- } ;
73- handleInputChange ( 'members' , [ ...formData . members , newMember ] ) ;
74- setSearchQuery ( '' ) ;
70+ const trimmed = email . trim ( ) ;
71+
72+ if ( ! trimmed ) {
73+ setErrors ( prev => ( {
74+ ...prev ,
75+ email : 'Please enter an email address.' ,
76+ } ) ) ;
77+ return ;
78+ }
79+
80+ if ( ! isValidEmail ( trimmed ) ) {
81+ setErrors ( prev => ( {
82+ ...prev ,
83+ email : 'Please enter a valid email address.' ,
84+ } ) ) ;
85+ return ;
86+ }
87+
88+ if ( formData . members . some ( member => member . email === trimmed ) ) {
89+ setErrors ( prev => ( {
90+ ...prev ,
91+ email : 'This email is already added to the team.' ,
92+ } ) ) ;
93+ return ;
7594 }
95+
96+ const newMember : TeamMember = {
97+ id : Date . now ( ) . toString ( ) ,
98+ email : trimmed ,
99+ role : 'MEMBER' ,
100+ } ;
101+ handleFormDataChange ( 'members' , [ ...formData . members , newMember ] ) ;
102+ setSearchQuery ( '' ) ;
103+ setErrors ( prev => ( { ...prev , email : undefined } ) ) ;
76104 } ;
77105
78106 const removeMember = ( id : string ) => {
79107 const updatedMembers = formData . members . filter (
80108 member => member . id !== id
81109 ) ;
82- handleInputChange ( 'members' , updatedMembers ) ;
110+ handleFormDataChange ( 'members' , updatedMembers ) ;
83111 } ;
84112
85113 const handleKeyPress = ( e : React . KeyboardEvent ) => {
@@ -89,8 +117,18 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
89117 }
90118 } ;
91119
120+ const handleEmailInputChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
121+ const value = e . target . value ;
122+ setSearchQuery ( value ) ;
123+
124+ // Clear email error when user starts typing
125+ if ( errors . email ) {
126+ setErrors ( prev => ( { ...prev , email : undefined } ) ) ;
127+ }
128+ } ;
129+
92130 const validateForm = ( ) : boolean => {
93- const newErrors : { members ?: string } = { } ;
131+ const newErrors : { members ?: string ; email ?: string } = { } ;
94132
95133 setErrors ( newErrors ) ;
96134 return Object . keys ( newErrors ) . length === 0 ;
@@ -122,7 +160,7 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
122160
123161 < div className = 'space-y-4' >
124162 < Label className = 'text-white' >
125- Invite members to your team (optional)
163+ Invite members to your team by email (optional)
126164 </ Label >
127165
128166 < div className = 'space-y-4' >
@@ -133,9 +171,7 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
133171 key = { member . id }
134172 className = 'flex items-center space-x-1 rounded-full bg-[#A7F95014] py-1.5 pr-1.5 pl-2'
135173 >
136- < span className = 'text-primary text-sm' >
137- { member . username }
138- </ span >
174+ < span className = 'text-primary text-sm' > { member . email } </ span >
139175 < Button
140176 type = 'button'
141177 variant = 'ghost'
@@ -164,10 +200,10 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
164200 ) ) }
165201
166202 < input
167- type = 'text '
168- placeholder = { 'Search by name, handle, or email' }
203+ type = 'email '
204+ placeholder = { 'Enter email address ' }
169205 value = { searchQuery }
170- onChange = { e => setSearchQuery ( e . target . value ) }
206+ onChange = { handleEmailInputChange }
171207 onKeyPress = { handleKeyPress }
172208 className = 'min-w-[200px] flex-1 bg-transparent text-sm text-white placeholder:text-[#919191] focus:outline-none'
173209 />
@@ -189,6 +225,9 @@ const Team = React.forwardRef<{ validate: () => boolean }, TeamProps>(
189225 { errors . members && (
190226 < p className = 'text-sm text-red-500' > { errors . members } </ p >
191227 ) }
228+ { errors . email && (
229+ < p className = 'text-sm text-red-500' > { errors . email } </ p >
230+ ) }
192231 </ div >
193232 </ div >
194233 ) ;
0 commit comments