@@ -7,6 +7,7 @@ import { FormattedMessage } from 'react-intl';
7
7
8
8
import messages from './messages' ;
9
9
import { Button } from '../button' ;
10
+ import { Alert } from '../alert' ;
10
11
import { DeleteModal } from '../deleteModal' ;
11
12
import { styleClasses } from '../../views/projectEdit' ;
12
13
import { fetchLocalJSONAPI , pushToLocalJSONAPI } from '../../network/genericJSONRequest' ;
@@ -16,11 +17,11 @@ import FileRejections from '../comments/fileRejections';
16
17
import DropzoneUploadStatus from '../comments/uploadStatus' ;
17
18
import { DROPZONE_SETTINGS } from '../../config' ;
18
19
19
- const checkError = ( error , modal ) => {
20
+ const ActionStatus = ( { status , action } ) => {
20
21
let successMessage = '' ;
21
22
let errorMessage = '' ;
22
23
23
- switch ( modal ) {
24
+ switch ( action ) {
24
25
case 'MESSAGE_CONTRIBUTORS' :
25
26
successMessage = 'messageContributorsSuccess' ;
26
27
errorMessage = 'messageContributorsError' ;
@@ -56,35 +57,27 @@ const checkError = (error, modal) => {
56
57
default :
57
58
return null ;
58
59
}
59
- if ( error === null ) {
60
- return null ;
61
- }
62
60
63
- if ( error === false ) {
64
- return (
65
- < p className = "pv2 white tc bg-dark-green" >
66
- { < FormattedMessage { ...messages [ successMessage ] } /> }
67
- </ p >
68
- ) ;
69
- } else {
70
- return (
71
- < p className = "pv2 white tc bg-light-red" >
72
- { < FormattedMessage { ...messages [ errorMessage ] } /> }
73
- </ p >
74
- ) ;
75
- }
61
+ return (
62
+ < >
63
+ { status === 'success' && (
64
+ < Alert type = "success" >
65
+ < FormattedMessage { ...messages [ successMessage ] } />
66
+ </ Alert >
67
+ ) }
68
+ { status === 'error' && (
69
+ < Alert type = "error" > { < FormattedMessage { ...messages [ errorMessage ] } /> } </ Alert >
70
+ ) }
71
+ </ >
72
+ ) ;
76
73
} ;
77
74
78
75
const ResetTasksModal = ( { projectId, close } : Object ) => {
79
76
const token = useSelector ( ( state ) => state . auth . get ( 'token' ) ) ;
80
- const [ error , setError ] = useState ( null ) ;
81
77
82
78
const resetTasks = ( ) => {
83
- return fetchLocalJSONAPI ( `projects/${ projectId } /tasks/actions/reset-all/` , token , 'POST' )
84
- . then ( ( res ) => setError ( false ) )
85
- . catch ( ( e ) => setError ( true ) ) ;
79
+ return fetchLocalJSONAPI ( `projects/${ projectId } /tasks/actions/reset-all/` , token , 'POST' ) ;
86
80
} ;
87
-
88
81
const resetTasksAsync = useAsync ( resetTasks ) ;
89
82
90
83
return (
@@ -97,7 +90,7 @@ const ResetTasksModal = ({ projectId, close }: Object) => {
97
90
< FormattedMessage { ...messages . taskResetConfirmation } />
98
91
</ p >
99
92
100
- { checkError ( error , ' RESET_ALL' ) }
93
+ < ActionStatus status = { resetTasksAsync . status } action = " RESET_ALL" />
101
94
< p className = "tr" >
102
95
< Button className = { styleClasses . whiteButtonClass } onClick = { close } >
103
96
< FormattedMessage { ...messages . cancel } />
@@ -117,16 +110,13 @@ const ResetTasksModal = ({ projectId, close }: Object) => {
117
110
118
111
const ResetBadImageryModal = ( { projectId, close } : Object ) => {
119
112
const token = useSelector ( ( state ) => state . auth . get ( 'token' ) ) ;
120
- const [ error , setError ] = useState ( null ) ;
121
113
122
114
const resetBadImagery = ( ) => {
123
115
return fetchLocalJSONAPI (
124
116
`projects/${ projectId } /tasks/actions/reset-all-badimagery/` ,
125
117
token ,
126
118
'POST' ,
127
- )
128
- . then ( ( res ) => setError ( false ) )
129
- . catch ( ( e ) => setError ( true ) ) ;
119
+ ) ;
130
120
} ;
131
121
132
122
const resetBadImageryAsync = useAsync ( resetBadImagery ) ;
@@ -144,30 +134,29 @@ const ResetBadImageryModal = ({ projectId, close }: Object) => {
144
134
< FormattedMessage { ...messages . resetBadImageryDescription } />
145
135
</ p >
146
136
147
- { checkError ( error , 'RESET_BAD_IMAGERY' ) }
148
- < Button className = { styleClasses . whiteButtonClass } onClick = { close } >
149
- < FormattedMessage { ...messages . cancel } />
150
- </ Button >
151
- < Button
152
- className = { styleClasses . redButtonClass }
153
- onClick = { ( ) => resetBadImageryAsync . execute ( ) }
154
- loading = { resetBadImageryAsync . status === 'pending' }
155
- disabled = { resetBadImageryAsync . status === 'pending' }
156
- >
157
- < FormattedMessage { ...messages . resetBadImageryButton } />
158
- </ Button >
137
+ < ActionStatus status = { resetBadImageryAsync . status } action = "RESET_BAD_IMAGERY" />
138
+ < p >
139
+ < Button className = { styleClasses . whiteButtonClass } onClick = { close } >
140
+ < FormattedMessage { ...messages . cancel } />
141
+ </ Button >
142
+ < Button
143
+ className = { styleClasses . redButtonClass }
144
+ onClick = { ( ) => resetBadImageryAsync . execute ( ) }
145
+ loading = { resetBadImageryAsync . status === 'pending' }
146
+ disabled = { resetBadImageryAsync . status === 'pending' }
147
+ >
148
+ < FormattedMessage { ...messages . resetBadImageryButton } />
149
+ </ Button >
150
+ </ p >
159
151
</ div >
160
152
) ;
161
153
} ;
162
154
163
155
const ValidateAllTasksModal = ( { projectId, close } : Object ) => {
164
156
const token = useSelector ( ( state ) => state . auth . get ( 'token' ) ) ;
165
- const [ error , setError ] = useState ( null ) ;
166
157
167
158
const validateAllTasks = ( ) => {
168
- return fetchLocalJSONAPI ( `projects/${ projectId } /tasks/actions/validate-all/` , token , 'POST' )
169
- . then ( ( res ) => setError ( false ) )
170
- . catch ( ( e ) => setError ( true ) ) ;
159
+ return fetchLocalJSONAPI ( `projects/${ projectId } /tasks/actions/validate-all/` , token , 'POST' ) ;
171
160
} ;
172
161
173
162
const validateAllTasksAsync = useAsync ( validateAllTasks ) ;
@@ -185,30 +174,29 @@ const ValidateAllTasksModal = ({ projectId, close }: Object) => {
185
174
< FormattedMessage { ...messages . validateAllTasksDescription } />
186
175
</ p >
187
176
188
- { checkError ( error , 'VALIDATE_ALL_TASKS' ) }
189
- < Button className = { styleClasses . whiteButtonClass } onClick = { close } >
190
- < FormattedMessage { ...messages . cancel } />
191
- </ Button >
192
- < Button
193
- className = { styleClasses . redButtonClass }
194
- onClick = { ( ) => validateAllTasksAsync . execute ( ) }
195
- loading = { validateAllTasksAsync . status === 'pending' }
196
- disabled = { validateAllTasksAsync . status === 'pending' }
197
- >
198
- < FormattedMessage { ...messages . validateAllTasks } />
199
- </ Button >
177
+ < ActionStatus status = { validateAllTasksAsync . status } action = "VALIDATE_ALL_TASKS" />
178
+ < p >
179
+ < Button className = { styleClasses . whiteButtonClass } onClick = { close } >
180
+ < FormattedMessage { ...messages . cancel } />
181
+ </ Button >
182
+ < Button
183
+ className = { styleClasses . redButtonClass }
184
+ onClick = { ( ) => validateAllTasksAsync . execute ( ) }
185
+ loading = { validateAllTasksAsync . status === 'pending' }
186
+ disabled = { validateAllTasksAsync . status === 'pending' }
187
+ >
188
+ < FormattedMessage { ...messages . validateAllTasks } />
189
+ </ Button >
190
+ </ p >
200
191
</ div >
201
192
) ;
202
193
} ;
203
194
204
195
const InvalidateAllTasksModal = ( { projectId, close } : Object ) => {
205
196
const token = useSelector ( ( state ) => state . auth . get ( 'token' ) ) ;
206
- const [ error , setError ] = useState ( null ) ;
207
197
208
198
const invalidateAllTasks = ( ) => {
209
- return fetchLocalJSONAPI ( `projects/${ projectId } /tasks/actions/invalidate-all/` , token , 'POST' )
210
- . then ( ( res ) => setError ( false ) )
211
- . catch ( ( e ) => setError ( true ) ) ;
199
+ return fetchLocalJSONAPI ( `projects/${ projectId } /tasks/actions/invalidate-all/` , token , 'POST' ) ;
212
200
} ;
213
201
214
202
const invalidateAllTasksAsync = useAsync ( invalidateAllTasks ) ;
@@ -226,32 +214,30 @@ const InvalidateAllTasksModal = ({ projectId, close }: Object) => {
226
214
< FormattedMessage { ...messages . invalidateAllDescription } />
227
215
</ p >
228
216
229
- { checkError ( error , 'INVALIDATE_ALL_TASKS' ) }
230
- < Button className = { styleClasses . whiteButtonClass } onClick = { close } >
231
- < FormattedMessage { ...messages . cancel } />
232
- </ Button >
233
- < Button
234
- className = { styleClasses . redButtonClass }
235
- onClick = { ( ) => invalidateAllTasksAsync . execute ( ) }
236
- loading = { invalidateAllTasksAsync . status === 'pending' }
237
- disabled = { invalidateAllTasksAsync . status === 'pending' }
238
- >
239
- < FormattedMessage { ...messages . invalidateAll } />
240
- </ Button >
217
+ < ActionStatus status = { invalidateAllTasksAsync . status } action = "INVALIDATE_ALL_TASKS" />
218
+ < p >
219
+ < Button className = { styleClasses . whiteButtonClass } onClick = { close } >
220
+ < FormattedMessage { ...messages . cancel } />
221
+ </ Button >
222
+ < Button
223
+ className = { styleClasses . redButtonClass }
224
+ onClick = { ( ) => invalidateAllTasksAsync . execute ( ) }
225
+ loading = { invalidateAllTasksAsync . status === 'pending' }
226
+ disabled = { invalidateAllTasksAsync . status === 'pending' }
227
+ >
228
+ < FormattedMessage { ...messages . invalidateAll } />
229
+ </ Button >
230
+ </ p >
241
231
</ div >
242
232
) ;
243
233
} ;
244
234
245
235
const MapAllTasksModal = ( { projectId, close } : Object ) => {
246
236
const token = useSelector ( ( state ) => state . auth . get ( 'token' ) ) ;
247
- const [ error , setError ] = useState ( null ) ;
248
237
249
238
const mapAllTasks = ( ) => {
250
- return fetchLocalJSONAPI ( `projects/${ projectId } /tasks/actions/map-all/` , token , 'POST' )
251
- . then ( ( res ) => setError ( false ) )
252
- . catch ( ( e ) => setError ( true ) ) ;
239
+ return fetchLocalJSONAPI ( `projects/${ projectId } /tasks/actions/map-all/` , token , 'POST' ) ;
253
240
} ;
254
-
255
241
const mapAllTasksAsync = useAsync ( mapAllTasks ) ;
256
242
257
243
return (
@@ -265,18 +251,20 @@ const MapAllTasksModal = ({ projectId, close }: Object) => {
265
251
< p className = { `${ styleClasses . pClass } pb2` } >
266
252
< FormattedMessage { ...messages . mapAllDescription } />
267
253
</ p >
268
- { checkError ( error , 'MAP_ALL_TASKS' ) }
269
- < Button className = { styleClasses . whiteButtonClass } onClick = { close } >
270
- < FormattedMessage { ...messages . cancel } />
271
- </ Button >
272
- < Button
273
- className = { styleClasses . redButtonClass }
274
- onClick = { ( ) => mapAllTasksAsync . execute ( ) }
275
- loading = { mapAllTasksAsync . status === 'pending' }
276
- disabled = { mapAllTasksAsync . status === 'pending' }
277
- >
278
- < FormattedMessage { ...messages . mapAll } />
279
- </ Button >
254
+ < ActionStatus status = { mapAllTasksAsync . status } action = "MAP_ALL_TASKS" />
255
+ < p >
256
+ < Button className = { styleClasses . whiteButtonClass } onClick = { close } >
257
+ < FormattedMessage { ...messages . cancel } />
258
+ </ Button >
259
+ < Button
260
+ className = { styleClasses . redButtonClass }
261
+ onClick = { ( ) => mapAllTasksAsync . execute ( ) }
262
+ loading = { mapAllTasksAsync . status === 'pending' }
263
+ disabled = { mapAllTasksAsync . status === 'pending' }
264
+ >
265
+ < FormattedMessage { ...messages . mapAll } />
266
+ </ Button >
267
+ </ p >
280
268
</ div >
281
269
) ;
282
270
} ;
@@ -291,17 +279,14 @@ const MessageContributorsModal = ({ projectId, close }: Object) => {
291
279
onDrop,
292
280
...DROPZONE_SETTINGS ,
293
281
} ) ;
294
- const [ error , setError ] = useState ( null ) ;
295
282
296
283
const messageAllContributors = ( ) => {
297
284
return pushToLocalJSONAPI (
298
285
`projects/${ projectId } /actions/message-contributors/` ,
299
286
JSON . stringify ( data ) ,
300
287
token ,
301
288
'POST' ,
302
- )
303
- . then ( ( res ) => setError ( false ) )
304
- . catch ( ( e ) => setError ( true ) ) ;
289
+ ) ;
305
290
} ;
306
291
307
292
const messageAllContributorsAsync = useAsync ( messageAllContributors ) ;
@@ -356,25 +341,27 @@ const MessageContributorsModal = ({ projectId, close }: Object) => {
356
341
< p className = { styleClasses . pClass } >
357
342
< FormattedMessage { ...messages . messageContributorsTranslationAlert } />
358
343
</ p >
359
- { checkError ( error , 'MESSAGE_CONTRIBUTORS' ) }
360
- < Button className = { styleClasses . whiteButtonClass } onClick = { close } >
361
- < FormattedMessage { ...messages . cancel } />
362
- </ Button >
363
- < Button
364
- className = { styleClasses . redButtonClass }
365
- onClick = { ( ) => messageAllContributorsAsync . execute ( ) }
366
- loading = { messageAllContributorsAsync . status === 'pending' }
367
- disabled = { messageAllContributorsAsync . status === 'pending' }
368
- >
369
- < FormattedMessage { ...messages . messageContributors } />
370
- </ Button >
344
+
345
+ < ActionStatus status = { messageAllContributorsAsync . status } action = "MAP_ALL_TASKS" />
346
+ < p >
347
+ < Button className = { styleClasses . whiteButtonClass } onClick = { close } >
348
+ < FormattedMessage { ...messages . cancel } />
349
+ </ Button >
350
+ < Button
351
+ className = { styleClasses . redButtonClass }
352
+ onClick = { ( ) => messageAllContributorsAsync . execute ( ) }
353
+ loading = { messageAllContributorsAsync . status === 'pending' }
354
+ disabled = { messageAllContributorsAsync . status === 'pending' }
355
+ >
356
+ < FormattedMessage { ...messages . messageContributors } />
357
+ </ Button >
358
+ </ p >
371
359
</ div >
372
360
) ;
373
361
} ;
374
362
375
363
const TransferProject = ( { projectId } : Object ) => {
376
364
const token = useSelector ( ( state ) => state . auth . get ( 'token' ) ) ;
377
- const [ error , setError ] = useState ( null ) ;
378
365
const [ username , setUsername ] = useState ( '' ) ;
379
366
const [ users , setUsers ] = useState ( [ ] ) ;
380
367
const handleUsers = ( e ) => {
@@ -395,18 +382,10 @@ const TransferProject = ({ projectId }: Object) => {
395
382
JSON . stringify ( { username : username } ) ,
396
383
token ,
397
384
'POST' ,
398
- )
399
- . then ( ( res ) => setError ( false ) )
400
- . catch ( ( e ) => setError ( true ) ) ;
385
+ ) ;
401
386
} ;
402
-
403
387
const transferOwnershipAsync = useAsync ( transferOwnership ) ;
404
388
405
- // Redirect on success.
406
- if ( error === false ) {
407
- setTimeout ( ( ) => ( window . location . href = '/explore' ) , 3000 ) ;
408
- }
409
-
410
389
return (
411
390
< div >
412
391
< Popup
@@ -448,7 +427,9 @@ const TransferProject = ({ projectId }: Object) => {
448
427
>
449
428
< FormattedMessage { ...messages . transferProject } />
450
429
</ Button >
451
- { checkError ( error , 'TRANSFER_PROJECT' ) }
430
+ < div className = "pt1" >
431
+ < ActionStatus status = { transferOwnershipAsync . status } action = "TRANSFER_PROJECT" />
432
+ </ div >
452
433
</ div >
453
434
) ;
454
435
} ;
0 commit comments