diff --git a/src/shared/components/challenge-detail/Header/DeadlinesPanel/index.jsx b/src/shared/components/challenge-detail/Header/DeadlinesPanel/index.jsx index 7eb853efd1..081d958d84 100644 --- a/src/shared/components/challenge-detail/Header/DeadlinesPanel/index.jsx +++ b/src/shared/components/challenge-detail/Header/DeadlinesPanel/index.jsx @@ -35,7 +35,6 @@ export default function DeadlinesPanel({ deadlines }) { } } if (index === deadlines.length - 1) { - name = 'Winners Announced'; showRange = false; } diff --git a/src/shared/components/challenge-detail/Header/index.jsx b/src/shared/components/challenge-detail/Header/index.jsx index 9898b37059..a92b2e90a6 100644 --- a/src/shared/components/challenge-detail/Header/index.jsx +++ b/src/shared/components/challenge-detail/Header/index.jsx @@ -17,6 +17,9 @@ import { PrimaryButton } from 'topcoder-react-ui-kit'; import { Link } from 'topcoder-react-utils'; import { COMPETITION_TRACKS } from 'utils/tc'; import { phaseEndDate } from 'utils/challenge-listing/helper'; +import { + getTimeLeft, +} from 'utils/challenge-detail/helper'; import LeftArrow from 'assets/images/arrow-prev.svg'; @@ -30,6 +33,10 @@ import TabSelector from './TabSelector'; import style from './style.scss'; +/* Holds day and hour range in ms. */ +const HOUR_MS = 60 * 60 * 1000; +const DAY_MS = 24 * HOUR_MS; + export default function ChallengeHeader(props) { const { isLoggedIn, @@ -108,6 +115,10 @@ export default function ChallengeHeader(props) { registrationEnded = !regPhase.isOpen; } + const currentPhases = challenge.phases + .filter(p => p.name !== 'Registration' && p.isOpen) + .sort((a, b) => moment(a.scheduledEndDate).diff(b.scheduledEndDate))[0]; + const trackLower = track ? track.replace(' ', '-').toLowerCase() : 'design'; const eventNames = (events || []).map((event => (event.eventName || '').toUpperCase())); @@ -128,6 +139,31 @@ export default function ChallengeHeader(props) { */ const hasSubmissions = !_.isEmpty(mySubmissions); + const openPhases = sortedAllPhases.filter(p => p.isOpen); + let nextPhase = openPhases[0]; + if (hasRegistered && openPhases[0] && openPhases[0].name === 'Registration') { + nextPhase = openPhases[1] || {}; + } + + const deadlineEnd = moment(nextPhase && phaseEndDate(nextPhase)); + const currentTime = moment(); + + const timeDiff = getTimeLeft(currentPhases, 'to go'); + + if (!timeDiff.late) { + timeDiff.text = timeDiff.text.replace('to go', ''); + } + + let timeLeft = deadlineEnd.isAfter(currentTime) + ? deadlineEnd.diff(currentTime) : 0; + + let format; + if (timeLeft > DAY_MS) format = 'D[d] H[h]'; + else if (timeLeft > HOUR_MS) format = 'H[h] m[min]'; + else format = 'm[min] s[s]'; + + timeLeft = moment.duration(timeLeft).format(format); + let relevantPhases = []; if (showDeadlineDetail) { @@ -177,31 +213,52 @@ export default function ChallengeHeader(props) { || phaseEndDate(p).getTime() < endPhaseDate)); relevantPhases.push({ id: -1, - name: 'Winners', + name: 'Winners Announced', isOpen: false, actualEndDate: endPhaseDate, scheduledEndDate: endPhaseDate, }); } else if (relevantPhases.length > 1) { - const lastPhase = relevantPhases[relevantPhases.length - 1]; - const lastPhaseTime = phaseEndDate(lastPhase).getTime(); - + // const lastPhase = relevantPhases[relevantPhases.length - 1]; + // const lastPhaseTime = phaseEndDate(lastPhase).getTime(); const appealsEndDate = phaseEndDate(sortedAllPhases[sortedAllPhases.length - 1]); - const appealsEnd = appealsEndDate.getTime(); - if (lastPhaseTime < appealsEnd) { - relevantPhases.push({ - id: -1, - name: 'Winners', - isOpen: false, - actualEndDate: appealsEndDate, - scheduledEndDate: appealsEndDate, - }); - } + // const appealsEnd = appealsEndDate.getTime(); + relevantPhases.push({ + id: -1, + name: 'Winners Announced', + isOpen: false, + actualEndDate: appealsEndDate, + scheduledEndDate: appealsEndDate, + }); } } const checkpointCount = checkpoints && checkpoints.numberOfPassedScreeningSubmissions; + let nextDeadlineMsg; + switch ((status || '').toLowerCase()) { + case 'completed': + nextDeadlineMsg = ( +