@@ -15,6 +15,7 @@ import React from 'react';
15
15
import { DangerButton , PrimaryButton } from 'topcoder-react-ui-kit' ;
16
16
import { Link } from 'topcoder-react-utils' ;
17
17
import { COMPETITION_TRACKS } from 'utils/tc' ;
18
+ import { phaseEndDate } from 'utils/challenge-listing/helper' ;
18
19
19
20
import LeftArrow from 'assets/images/arrow-prev.svg' ;
20
21
@@ -69,16 +70,17 @@ export default function ChallengeHeader(props) {
69
70
numOfRegistrants,
70
71
numOfCheckpointSubmissions,
71
72
numOfSubmissions,
72
- endDate,
73
73
status,
74
74
type,
75
75
track,
76
76
} = challenge ;
77
77
78
78
const tags = challenge . tags || [ ] ;
79
- const appealsEndDate = endDate ;
80
79
81
80
const allPhases = challenge . phases || [ ] ;
81
+ const sortedAllPhases = _ . cloneDeep ( allPhases )
82
+ . sort ( ( a , b ) => moment ( phaseEndDate ( a ) ) . diff ( phaseEndDate ( b ) ) ) ;
83
+
82
84
const { prizes } = prizeSets && prizeSets . length ? prizeSets [ 0 ] : [ ] ;
83
85
84
86
const checkpointPrizes = _ . find ( prizeSets , { type : 'checkpoint' } ) ;
@@ -122,14 +124,14 @@ export default function ChallengeHeader(props) {
122
124
*/
123
125
const hasSubmissions = ! _ . isEmpty ( mySubmissions ) ;
124
126
125
- let nextPhase = allPhases . filter ( p => p . isOpen )
126
- . sort ( ( a , b ) => moment ( a . scheduledEndDate ) . diff ( b . scheduledEndDate ) ) [ 0 ] ;
127
- if ( hasRegistered && allPhases [ 0 ] && allPhases [ 0 ] . name === 'Registration' ) {
128
- nextPhase = allPhases [ 1 ] || { } ;
127
+ const openPhases = sortedAllPhases . filter ( p => p . isOpen ) ;
128
+ let nextPhase = openPhases [ 0 ] ;
129
+ if ( hasRegistered && openPhases [ 0 ] && openPhases [ 0 ] . name === 'Registration' ) {
130
+ nextPhase = openPhases [ 1 ] || { } ;
129
131
}
130
132
const nextDeadline = nextPhase && nextPhase . name ;
131
133
132
- const deadlineEnd = moment ( nextPhase && nextPhase . scheduledEndDate ) ;
134
+ const deadlineEnd = moment ( nextPhase && phaseEndDate ( nextPhase ) ) ;
133
135
const currentTime = moment ( ) ;
134
136
135
137
let timeLeft = deadlineEnd . isAfter ( currentTime )
@@ -147,8 +149,8 @@ export default function ChallengeHeader(props) {
147
149
if ( showDeadlineDetail ) {
148
150
relevantPhases = ( allPhases || [ ] ) . filter ( ( phase ) => {
149
151
if ( phase . name === 'Iterative Review' ) {
150
- const end = phase . actualEndDate || phase . scheduledEndDate ;
151
- return moment ( end ) . isAfter ( moment ( ) ) ;
152
+ const end = phaseEndDate ( phase ) ;
153
+ return moment ( end ) . isAfter ( ) ;
152
154
}
153
155
const phaseLowerCase = phase . name . toLowerCase ( ) ;
154
156
if ( phaseLowerCase . includes ( 'screening' ) || phaseLowerCase . includes ( 'specification' ) ) {
@@ -168,30 +170,34 @@ export default function ChallengeHeader(props) {
168
170
if ( b . name . toLowerCase ( ) . includes ( 'registration' ) ) {
169
171
return 1 ;
170
172
}
171
- return ( new Date ( a . scheduledEndDate || a . actualEndDate ) ) . getTime ( )
172
- - ( new Date ( b . scheduledEndDate || b . actualEndDate ) ) . getTime ( ) ;
173
+ const aEndDate = phaseEndDate ( a ) ;
174
+ const bEndDate = phaseEndDate ( b ) ;
175
+ return moment ( aEndDate ) . diff ( bEndDate ) ;
173
176
} ) ;
174
177
if ( type === 'First2Finish' && status === 'Completed' ) {
175
178
const phases2 = allPhases . filter ( p => p . name === 'Iterative Review' && ! p . isOpen ) ;
176
- const endPhaseDate = Math . max ( ...phases2 . map ( d => new Date ( d . scheduledEndDate ) ) ) ;
179
+ const endPhaseDate = Math . max ( ...phases2 . map ( d => phaseEndDate ( d ) ) ) ;
177
180
relevantPhases = _ . filter ( relevantPhases , p => ( p . name . toLowerCase ( ) . includes ( 'registration' )
178
- || new Date ( p . scheduledEndDate ) . getTime ( ) < endPhaseDate ) ) ;
181
+ || phaseEndDate ( p ) . getTime ( ) < endPhaseDate ) ) ;
179
182
relevantPhases . push ( {
180
183
id : - 1 ,
181
184
name : 'Winners' ,
185
+ isOpen : false ,
186
+ actualEndDate : endPhaseDate ,
182
187
scheduledEndDate : endPhaseDate ,
183
188
} ) ;
184
189
} else if ( relevantPhases . length > 1 ) {
185
190
const lastPhase = relevantPhases [ relevantPhases . length - 1 ] ;
186
- const lastPhaseTime = (
187
- new Date ( lastPhase . actualEndDate || lastPhase . scheduledEndDate )
188
- ) . getTime ( ) ;
191
+ const lastPhaseTime = phaseEndDate ( lastPhase ) . getTime ( ) ;
189
192
190
- const appealsEnd = ( new Date ( appealsEndDate ) . getTime ( ) ) ;
191
- if ( lastPhaseTime < appealsEnd && lastPhase . name !== 'Review' ) {
193
+ const appealsEndDate = phaseEndDate ( sortedAllPhases [ sortedAllPhases . length - 1 ] ) ;
194
+ const appealsEnd = appealsEndDate . getTime ( ) ;
195
+ if ( lastPhaseTime < appealsEnd ) {
192
196
relevantPhases . push ( {
193
197
id : - 1 ,
194
198
name : 'Winners' ,
199
+ isOpen : false ,
200
+ actualEndDate : appealsEndDate ,
195
201
scheduledEndDate : appealsEndDate ,
196
202
} ) ;
197
203
}
@@ -495,7 +501,6 @@ ChallengeHeader.propTypes = {
495
501
numOfCheckpointSubmissions : PT . any ,
496
502
numOfSubmissions : PT . any ,
497
503
status : PT . any ,
498
- endDate : PT . any ,
499
504
phases : PT . any ,
500
505
roundId : PT . any ,
501
506
prizeSets : PT . any ,
0 commit comments