@@ -30,6 +30,10 @@ import TabSelector from './TabSelector';
3030
3131import style from './style.scss' ;
3232
33+ /* Holds day and hour range in ms. */
34+ const HOUR_MS = 60 * 60 * 1000 ;
35+ const DAY_MS = 24 * HOUR_MS ;
36+
3337export default function ChallengeHeader ( props ) {
3438 const {
3539 isLoggedIn,
@@ -128,6 +132,26 @@ export default function ChallengeHeader(props) {
128132 */
129133 const hasSubmissions = ! _ . isEmpty ( mySubmissions ) ;
130134
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+
131155 let relevantPhases = [ ] ;
132156
133157 if ( showDeadlineDetail ) {
@@ -202,6 +226,41 @@ export default function ChallengeHeader(props) {
202226
203227 const checkpointCount = checkpoints && checkpoints . numberOfPassedScreeningSubmissions ;
204228
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+
205264 // Legacy MMs have a roundId field, but new MMs do not.
206265 // This is used to disable registration/submission for legacy MMs.
207266 const isLegacyMM = isMM ( challenge ) && Boolean ( challenge . roundId ) ;
@@ -382,7 +441,18 @@ export default function ChallengeHeader(props) {
382441 < div styleName = "deadlines-view" >
383442 < div styleName = { `deadlines-overview ${ showDeadlineDetail ? 'opened' : '' } ` } >
384443 < 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+ }
386456 </ div >
387457 < a
388458 onClick = { onToggleDeadlines }
0 commit comments