@@ -30,6 +30,10 @@ import TabSelector from './TabSelector';
30
30
31
31
import style from './style.scss' ;
32
32
33
+ /* Holds day and hour range in ms. */
34
+ const HOUR_MS = 60 * 60 * 1000 ;
35
+ const DAY_MS = 24 * HOUR_MS ;
36
+
33
37
export default function ChallengeHeader ( props ) {
34
38
const {
35
39
isLoggedIn,
@@ -128,6 +132,26 @@ export default function ChallengeHeader(props) {
128
132
*/
129
133
const hasSubmissions = ! _ . isEmpty ( mySubmissions ) ;
130
134
135
+ const openPhases = sortedAllPhases . filter ( p => p . isOpen ) ;
136
+ let nextPhase = openPhases [ 0 ] ;
137
+ if ( hasRegistered && openPhases [ 0 ] && openPhases [ 0 ] . name === 'Registration' ) {
138
+ nextPhase = openPhases [ 1 ] || { } ;
139
+ }
140
+ const nextDeadline = nextPhase && nextPhase . name ;
141
+
142
+ const deadlineEnd = moment ( nextPhase && phaseEndDate ( nextPhase ) ) ;
143
+ const currentTime = moment ( ) ;
144
+
145
+ let timeLeft = deadlineEnd . isAfter ( currentTime )
146
+ ? deadlineEnd . diff ( currentTime ) : 0 ;
147
+
148
+ let format ;
149
+ if ( timeLeft > DAY_MS ) format = 'D[d] H[h]' ;
150
+ else if ( timeLeft > HOUR_MS ) format = 'H[h] m[min]' ;
151
+ else format = 'm[min] s[s]' ;
152
+
153
+ timeLeft = moment . duration ( timeLeft ) . format ( format ) ;
154
+
131
155
let relevantPhases = [ ] ;
132
156
133
157
if ( showDeadlineDetail ) {
@@ -202,6 +226,41 @@ export default function ChallengeHeader(props) {
202
226
203
227
const checkpointCount = checkpoints && checkpoints . numberOfPassedScreeningSubmissions ;
204
228
229
+ let nextDeadlineMsg ;
230
+ switch ( ( status || '' ) . toLowerCase ( ) ) {
231
+ case 'active' :
232
+ nextDeadlineMsg = (
233
+ < div styleName = "next-deadline" >
234
+ Next Deadline:
235
+ { ' ' }
236
+ {
237
+ < span styleName = "deadline-highlighted" >
238
+ { nextDeadline || '-' }
239
+ </ span >
240
+ }
241
+ </ div >
242
+ ) ;
243
+ break ;
244
+ case 'completed' :
245
+ nextDeadlineMsg = (
246
+ < div styleName = "completed" >
247
+ The challenge is finished.
248
+ </ div >
249
+ ) ;
250
+ break ;
251
+ default :
252
+ nextDeadlineMsg = (
253
+ < div >
254
+ Status:
255
+ ‌
256
+ < span styleName = "deadline-highlighted" >
257
+ { _ . upperFirst ( _ . lowerCase ( status ) ) }
258
+ </ span >
259
+ </ div >
260
+ ) ;
261
+ break ;
262
+ }
263
+
205
264
// Legacy MMs have a roundId field, but new MMs do not.
206
265
// This is used to disable registration/submission for legacy MMs.
207
266
const isLegacyMM = isMM ( challenge ) && Boolean ( challenge . roundId ) ;
@@ -382,7 +441,18 @@ export default function ChallengeHeader(props) {
382
441
< div styleName = "deadlines-view" >
383
442
< div styleName = { `deadlines-overview ${ showDeadlineDetail ? 'opened' : '' } ` } >
384
443
< div styleName = "deadlines-overview-text" >
385
- Competition Timeline
444
+ { nextDeadlineMsg }
445
+ {
446
+ ( status || '' ) . toLowerCase ( ) === 'active'
447
+ && (
448
+ < div styleName = "current-phase" >
449
+ Current Deadline Ends:{ ' ' }
450
+ < span styleName = "deadline-highlighted" >
451
+ { timeLeft }
452
+ </ span >
453
+ </ div >
454
+ )
455
+ }
386
456
</ div >
387
457
< a
388
458
onClick = { onToggleDeadlines }
0 commit comments