1
1
import { getAllUser , getUser } from 'app/api/user' ;
2
- import React , { ChangeEvent , useState } from 'react' ;
2
+ import React , { ChangeEvent , useContext , useEffect , useState } from 'react' ;
3
3
import { useNavigate } from 'react-router-dom' ;
4
4
import { useQuery } from 'react-query' ;
5
5
import toast from 'react-hot-toast' ;
6
- import { addOrg , getAllOrgs } from 'app/api/organization' ;
6
+ import { addOrg , addOrgMembers , getAllOrgs } from 'app/api/organization' ;
7
7
import { uploadIcon } from 'app/api/file' ;
8
- import { useSelector } from 'react-redux' ;
9
- import { Organization } from 'app/state/reducers/orgReducers' ;
10
- import { RootState } from 'app/state/reducers' ;
11
-
12
-
13
8
14
9
import './index.scss' ;
10
+ import UserContext from 'app/context/user/userContext' ;
15
11
16
12
const AddWorkspace = ( ) => {
17
13
const navigate = useNavigate ( ) ;
18
14
const token = localStorage . getItem ( 'token' ) ;
15
+ const userContext = useContext ( UserContext ) ;
19
16
20
17
const [ selectedFile , setSelectedFile ] = useState < File | null > ( null ) ;
21
18
const [ name , SetName ] = useState < string | null > ( null ) ;
22
19
const [ description , setDiscription ] = useState < string | null > ( null ) ;
20
+ const [ validDescription , setValidDescription ] = useState < boolean > ( true ) ;
23
21
const [ validName , setValidName ] = useState < boolean > ( false ) ;
24
-
22
+ const [ uniqueName , setUniqueName ] = useState < boolean > ( false ) ;
25
23
const [ members , setMembers ] = useState < string [ ] > ( [ ] ) ;
26
24
const [ memberName , setMemberName ] = useState < string | null > ( null ) ;
27
25
28
26
const [ users , setUsers ] = useState < string [ ] > ( [ ] ) ;
29
27
const [ orgs , setOrgs ] = useState < string [ ] > ( [ ] ) ;
30
28
31
- const orgState = useSelector ( ( state :RootState ) => state . organization ) ;
32
-
33
-
34
29
const dataFetch = async ( ) => {
35
30
try {
36
31
if ( token ) {
@@ -52,30 +47,9 @@ const AddWorkspace = () => {
52
47
} catch ( e ) { }
53
48
} ;
54
49
55
- const checklogin = async ( ) => {
56
- if ( token != null ) {
57
- const userData = await getUser ( token ) ;
58
- return userData . data ;
59
- } else {
60
- toast . error ( 'Session expired' ) ;
61
- navigate ( '/login' ) ;
62
- }
63
- } ;
64
-
65
- const { data, isError } = useQuery ( {
66
- queryFn : ( ) => checklogin ( ) ,
67
- queryKey : 'checkLogin' ,
68
- } ) ;
69
-
70
- if ( isError ) {
71
- toast . error ( 'Session expired' ) ;
72
- navigate ( '/login' ) ;
73
- }
74
-
75
- const { } = useQuery ( {
76
- queryFn : ( ) => dataFetch ( ) ,
77
- queryKey : 'allUsersAndAllOrgs' ,
78
- } ) ;
50
+ useEffect ( ( ) => {
51
+ dataFetch ( ) ;
52
+ } , [ ] ) ;
79
53
80
54
const allowedFieTypes = [ 'image/jpeg' , 'image/jpg' , 'image/png' ] ;
81
55
@@ -94,41 +68,36 @@ const AddWorkspace = () => {
94
68
95
69
function valid_name ( str : string ) : boolean {
96
70
// Define a regular expression for special characters (excluding letters, digits, and spaces)
97
- const specialCharacters = / [ ^ a - z A - Z 0 - 9 \s ] / ;
71
+ const specialCharacters = / ^ [ a - z A - Z 0 - 9 _ - ] + $ / ;
98
72
99
73
// Check if the string contains any special characters
100
- return (
101
- specialCharacters . test ( str ) &&
102
- ! str . endsWith ( '/userspace' ) &&
103
- ! orgs . includes ( str )
104
-
105
- ) ;
74
+ return specialCharacters . test ( str ) && ! str . endsWith ( '-userspace' ) ;
106
75
}
107
76
108
- const isNotOrgName = ( orgName :string ) => {
109
- orgState . forEach ( el => {
110
- if ( el . name == orgName ) {
111
- return false
112
- }
113
- } )
114
- return true
77
+ function isUniqueName ( str : string ) : boolean {
78
+ return ! orgs . includes ( str ) ;
115
79
}
116
80
117
81
const handleNameChange = ( event : ChangeEvent < HTMLInputElement > ) => {
118
82
SetName ( event . target . value ) ;
119
-
120
-
121
-
122
- setValidName ( ( ) => valid_name ( event . target . value ) && isNotOrgName ( event . target . value ) ) ;
83
+ setUniqueName ( ( ) => isUniqueName ( event . target . value ) ) ;
84
+ setValidName ( ( ) => valid_name ( event . target . value ) ) ;
123
85
} ;
124
86
125
87
const handleDesriptionChange = ( event : ChangeEvent < HTMLInputElement > ) => {
126
88
setDiscription ( event . target . value ) ;
89
+ if ( description ?. length ) {
90
+ setValidDescription ( description . length < 200 ) ;
91
+ }
127
92
} ;
128
93
129
94
const addMembers = ( ) => {
130
95
if ( memberName ) {
131
- if ( users . includes ( memberName ) && memberName != data ?. message ) {
96
+ if (
97
+ users . includes ( memberName ) &&
98
+ memberName != userContext ?. username &&
99
+ ! members . includes ( memberName )
100
+ ) {
132
101
setMembers ( [ ...members , memberName ] ) ;
133
102
setMemberName ( null ) ;
134
103
}
@@ -137,52 +106,60 @@ const AddWorkspace = () => {
137
106
138
107
const removeMembers = ( member : string ) => {
139
108
const indexToRemove = members . indexOf ( member ) ;
140
- }
141
- const SubmitHandler = async ( ) :Promise < void > => {
142
-
143
- if ( description && token && name ) {
144
-
145
- const func = async ( ) :Promise < void > => {
146
- const dataRes = await addOrg ( token , {
147
- name :name ,
148
- description :description
149
- } )
150
-
151
- try {
152
- if ( selectedFile != null ) {
153
- const fileRes = uploadIcon ( token , name , selectedFile )
154
- } } catch ( e ) {
155
-
156
- }
157
- navigate ( "/workspace-view" )
158
- }
159
109
160
- toast . promise (
161
- func ( ) , {
162
- loading :'Saving...' ,
163
- success : < b > Workspace Saved</ b > ,
164
- error : < b > Could not save.</ b > ,
165
-
166
- }
167
- )
168
-
169
-
170
- } else {
110
+ if ( indexToRemove !== - 1 ) {
111
+ const updatedMembers = [
112
+ ...members . slice ( 0 , indexToRemove ) ,
113
+ ...members . slice ( indexToRemove + 1 ) ,
114
+ ] ;
171
115
116
+ setMembers ( updatedMembers ) ;
117
+ } else {
118
+ console . warn ( `Member "${ member } " not found in the members array.` ) ;
172
119
}
173
120
} ;
121
+ const SubmitHandler = async ( ) : Promise < void > => {
122
+ if (
123
+ description &&
124
+ token &&
125
+ name &&
126
+ validName &&
127
+ uniqueName &&
128
+ validDescription
129
+ ) {
130
+ const func = async ( ) : Promise < void > => {
131
+ const dataRes = await addOrg ( token , {
132
+ name : name ,
133
+ description : description ,
134
+ } ) ;
174
135
136
+ try {
137
+ if ( selectedFile != null ) {
138
+ const fileRes = uploadIcon ( token , name , selectedFile ) ;
139
+ }
140
+ } catch ( e ) { }
141
+ if ( members . length > 0 ) {
142
+ try {
175
143
176
-
177
-
144
+ const addMmebersRes = await addOrgMembers ( token , name , members ) ;
145
+
146
+ } catch ( e ) {
147
+
148
+ }
178
149
179
-
180
- toast . promise ( SubmitHandler ( ) , {
181
- loading : 'Saving Workspace' ,
182
- success : < b > Workspace saved</ b > ,
183
- error : < b > Could not save</ b > ,
184
- } ) ;
150
+ }
151
+ navigate ( '/workspace-view' ) ;
152
+ } ;
185
153
154
+ toast . promise ( func ( ) , {
155
+ loading : 'Saving Workspace' ,
156
+ success : < b > Workspace saved</ b > ,
157
+ error : < b > Could not save</ b > ,
158
+ } ) ;
159
+ } else {
160
+ toast . error ( 'Invalid inputs' ) ;
161
+ }
162
+ } ;
186
163
187
164
return (
188
165
< div className = 'main_aworkspace_container' >
@@ -215,6 +192,13 @@ const AddWorkspace = () => {
215
192
onChange = { handleNameChange }
216
193
placeholder = 'workspace name'
217
194
/>
195
+ { ! name ? < p > Name feild should not be empty</ p > : < > </ > }
196
+ { ! validName && name ? < p > Not a valid name</ p > : < > </ > }
197
+ { ! uniqueName && name ? (
198
+ < p > Name already taken. Try another name</ p >
199
+ ) : (
200
+ < > </ >
201
+ ) }
218
202
</ div >
219
203
< div className = 'single-form-element-container' >
220
204
< label className = 'label' htmlFor = 'workspace-description' >
@@ -228,6 +212,12 @@ const AddWorkspace = () => {
228
212
onChange = { handleDesriptionChange }
229
213
placeholder = 'workspace description'
230
214
/>
215
+ { ! description ? < p > Description feild should not be empty</ p > : < > </ > }
216
+ { ! validDescription ? (
217
+ < p > Characters length should be less than 200</ p >
218
+ ) : (
219
+ < > </ >
220
+ ) }
231
221
< div className = 'add-member-container' >
232
222
< input
233
223
type = 'text'
@@ -244,7 +234,8 @@ const AddWorkspace = () => {
244
234
className = 'add-member-button'
245
235
disabled = {
246
236
memberName
247
- ? ! users . includes ( memberName ) && memberName == data ?. message
237
+ ? ! users . includes ( memberName ) &&
238
+ memberName == userContext ?. username
248
239
: true
249
240
}
250
241
>
0 commit comments