@@ -11,13 +11,13 @@ import 'moment-duration-format'
11
11
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
12
12
import { faFile , faUser } from '@fortawesome/free-solid-svg-icons'
13
13
import ChallengeStatus from '../ChallengeStatus'
14
- import Modal from '../../Modal'
15
14
import ChallengeTag from '../ChallengeTag'
16
15
import styles from './ChallengeCard.module.scss'
17
16
import { getFormattedDuration } from '../../../util/date'
18
17
import { CHALLENGE_STATUS , COMMUNITY_APP_URL , DIRECT_PROJECT_URL , ONLINE_REVIEW_URL } from '../../../config/constants'
19
- import { OutlineButton , PrimaryButton } from '../../Buttons'
20
18
import { patchChallenge } from '../../../services/challenges'
19
+ import ConfirmationModal from '../../Modal/ConfirmationModal'
20
+ import AlertModal from '../../Modal/AlertModal'
21
21
22
22
const theme = {
23
23
container : styles . modalContainer
@@ -39,17 +39,16 @@ const getTimeLeft = (phase, status) => {
39
39
if ( phase . phaseType === 'Final Fix' ) {
40
40
return FF_TIME_LEFT_MSG
41
41
}
42
-
43
- let time = moment ( phase . scheduledEndTime ) . diff ( )
42
+ let time = moment ( phase . scheduledEndDate ) . diff ( )
44
43
const late = time < 0
45
44
if ( late ) time = - time
46
45
47
- if ( status !== CHALLENGE_STATUS . COMPLETED ) {
46
+ if ( status !== CHALLENGE_STATUS . COMPLETED . toLowerCase ( ) ) {
48
47
const duration = getFormattedDuration ( time )
49
48
return late ? `Late by ${ duration } ` : `${ duration } to go`
50
49
}
51
50
52
- return moment ( phase . scheduledEndTime ) . format ( 'DD/MM/YYYY' )
51
+ return moment ( phase . scheduledEndDate ) . format ( 'DD/MM/YYYY' )
53
52
}
54
53
55
54
/**
@@ -58,8 +57,8 @@ const getTimeLeft = (phase, status) => {
58
57
* @returns {{phaseMessage: string, endTime: {late, text}} }
59
58
*/
60
59
const getPhaseInfo = ( c ) => {
61
- const { allPhases , currentPhases , subTrack , status } = c
62
- let checkPhases = ( currentPhases && currentPhases . length > 0 ? currentPhases : allPhases )
60
+ const { currentPhaseNames , status , startDate , phases } = c
61
+ /* let checkPhases = (currentPhases && currentPhases.length > 0 ? currentPhases : allPhases)
63
62
if (_.isEmpty(checkPhases)) checkPhases = []
64
63
let statusPhase = checkPhases
65
64
.filter(p => p.phaseType !== 'Registration')
@@ -68,12 +67,26 @@ const getPhaseInfo = (c) => {
68
67
if (!statusPhase && subTrack === 'FIRST_2_FINISH' && checkPhases.length) {
69
68
statusPhase = Object.clone(checkPhases[0])
70
69
statusPhase.phaseType = 'Submission'
71
- }
70
+ } */
72
71
let phaseMessage = STALLED_MSG
73
- if ( statusPhase ) phaseMessage = statusPhase . phaseType
74
- else if ( status === 'DRAFT' ) phaseMessage = DRAFT_MSG
75
-
76
- const endTime = getTimeLeft ( statusPhase )
72
+ // if (statusPhase) phaseMessage = statusPhase.phaseType
73
+ // else if (status === 'DRAFT') phaseMessage = DRAFT_MSG
74
+ var lowerStatus = status . toLowerCase ( )
75
+ if ( lowerStatus === 'draft' ) {
76
+ phaseMessage = DRAFT_MSG
77
+ } else if ( lowerStatus === 'active' ) {
78
+ if ( ! currentPhaseNames || currentPhaseNames . length === 0 ) {
79
+ var timeToStart = moment ( startDate ) . diff ( )
80
+ if ( timeToStart > 0 ) {
81
+ phaseMessage = `Scheduled in ${ getFormattedDuration ( timeToStart ) } `
82
+ }
83
+ } else {
84
+ phaseMessage = currentPhaseNames . join ( '/' )
85
+ }
86
+ }
87
+ const activePhases = phases . filter ( p => ! ! p . isOpen )
88
+ const activePhase = activePhases . length > 0 ? activePhases [ 0 ] : null
89
+ const endTime = getTimeLeft ( activePhase , lowerStatus )
77
90
return { phaseMessage, endTime }
78
91
}
79
92
@@ -195,7 +208,8 @@ class ChallengeCard extends React.Component {
195
208
const response = await patchChallenge ( challenge . id , { status : 'Active' } )
196
209
this . setState ( { isLaunch : true , isConfirm : response . data . id , isSaving : false } )
197
210
} catch ( e ) {
198
- this . setState ( { isSaving : false } )
211
+ const error = _ . get ( e , 'response.data.message' , 'Unable to activate the challenge' )
212
+ this . setState ( { isSaving : false , error } )
199
213
}
200
214
}
201
215
@@ -206,37 +220,28 @@ class ChallengeCard extends React.Component {
206
220
return (
207
221
< div className = { styles . item } >
208
222
{ isLaunch && ! isConfirm && (
209
- < Modal theme = { theme } onCancel = { ( ) => this . resetModal ( ) } >
210
- < div className = { styles . contentContainer } >
211
- < div className = { styles . title } > Launch Challenge Confirmation</ div >
212
- < span > { `Do you want to launch ${ challenge . type } challenge "${ challenge . name } "?` } </ span >
213
- < div className = { styles . buttonGroup } >
214
- < div className = { styles . button } >
215
- < OutlineButton className = { cn ( { disabled : isSaving } ) } text = { 'Cancel' } type = { 'danger' } onClick = { ( ) => this . resetModal ( ) } />
216
- </ div >
217
- < div className = { styles . button } >
218
- < PrimaryButton text = { isSaving ? 'Launching...' : 'Confirm' } type = { 'info' } onClick = { ( ) => this . onLaunchChallenge ( ) } />
219
- </ div >
220
- </ div >
221
- </ div >
222
- </ Modal >
223
+ < ConfirmationModal
224
+ title = 'Confirm Launch'
225
+ message = { `Do you want to launch "${ challenge . name } "?` }
226
+ theme = { theme }
227
+ isProcessing = { isSaving }
228
+ errorMessage = { this . state . error }
229
+ onCancel = { this . resetModal }
230
+ onConfirm = { this . onLaunchChallenge }
231
+ />
223
232
)
224
233
}
225
234
{ isLaunch && isConfirm && (
226
- < Modal theme = { theme } onCancel = { reloadChallengeList } >
227
- < div className = { cn ( styles . contentContainer , styles . confirm ) } >
228
- < div className = { styles . title } > Success</ div >
229
- < span > Your challenge is saved as active</ span >
230
- < div className = { styles . buttonGroup } >
231
- < div className = { styles . buttonSizeA } onClick = { reloadChallengeList } >
232
- < PrimaryButton text = { 'Close' } type = { 'info' } />
233
- </ div >
234
- < div className = { styles . buttonSizeA } onClick = { ( ) => this . resetModal ( ) } >
235
- < OutlineButton text = { 'View Challenge' } type = { 'success' } link = { `/projects/${ challenge . projectId } /challenges/${ isConfirm } /view` } />
236
- </ div >
237
- </ div >
238
- </ div >
239
- </ Modal >
235
+ < AlertModal
236
+ title = 'Success'
237
+ message = { `Challenge "${ challenge . name } " is activated successfuly` }
238
+ theme = { theme }
239
+ onCancel = { reloadChallengeList }
240
+ closeText = 'Close'
241
+ okText = 'View Challenge'
242
+ okLink = './view'
243
+ onClose = { this . resetModal }
244
+ />
240
245
) }
241
246
242
247
< Link className = { styles . col1 } to = { `/projects/${ challenge . projectId } /challenges/${ challenge . id } /view` } >
@@ -258,11 +263,11 @@ class ChallengeCard extends React.Component {
258
263
< div className = { cn ( styles . col4 , styles . iconsContainer ) } >
259
264
< div className = { styles . faIconContainer } >
260
265
< FontAwesomeIcon icon = { faUser } className = { styles . faIcon } />
261
- < span > { challenge . numRegistrants || 0 } </ span >
266
+ < span > { challenge . numOfRegistrants || 0 } </ span >
262
267
</ div >
263
268
< div className = { styles . faIconContainer } >
264
269
< FontAwesomeIcon icon = { faFile } className = { styles . faIcon } />
265
- < span > { challenge . numSubmissions || 0 } </ span >
270
+ < span > { challenge . numOfSubmissions || 0 } </ span >
266
271
</ div >
267
272
</ div >
268
273
</ div >
0 commit comments