-
Romain CREY authoredRomain CREY authored
FollowChallengeTimeline.tsx 5.00 KiB
import React, { useContext } from 'react'
import { translate } from 'cozy-ui/react/I18n'
import { UserChallenge } from 'services/dataChallengeContracts'
import { DateTime, Interval } from 'luxon'
import { FluidType } from 'enum/fluid.enum'
import ChallengeManager from 'services/challengeDataManagerService'
import { AppContext } from 'components/Contexts/AppContextProvider'
import { Client } from 'cozy-client'
interface FollowChallengeTimelineViewProps {
challenge: UserChallenge
client: Client
}
const FollowChallengeTimeline: React.FC<FollowChallengeTimelineViewProps> = ({
challenge,
client,
}: FollowChallengeTimelineViewProps) => {
const { fluidTypes } = useContext(AppContext)
const challengeManager = new ChallengeManager(client)
const viewingDate = () => {
if (challenge && challenge.challengeType) {
const startingDate = challenge.startingDate
return startingDate.plus({
days: challengeManager.getLagDays(fluidTypes),
})
} else {
return DateTime.local()
}
}
const getListOfDays = () => {
if (challenge && challenge.challengeType) {
const startingDate = DateTime.fromISO(challenge.startingDate.toString())
const listOfChallengeDays = []
let i = 0
if (challenge.challengeType.duration.days === 7) {
while (challenge.challengeType.duration.days > i) {
listOfChallengeDays.push({
letter: startingDate
.plus({ days: i })
.weekdayShort[0].toUpperCase(),
date: startingDate.plus({ days: i }).day,
})
i++
}
} else {
while (challenge.challengeType.duration.days >= i) {
listOfChallengeDays.push({
letter: '',
date: startingDate.plus({ days: i }).toFormat('dd/MM'),
})
i += 7
}
}
return listOfChallengeDays
} else {
return []
}
}
const getListOfWeeks = () => {
if (challenge && challenge.challengeType) {
const startingDate = DateTime.fromISO(challenge.startingDate.toString())
const listOfChallengeDays = []
let i = 0
while (challenge.challengeType.duration.days >= i) {
listOfChallengeDays.push({
letter: '',
date: startingDate.plus({ days: i }).toFormat('dd/MM'),
})
i += 7
}
return listOfChallengeDays
} else {
return []
}
}
const getListOfPastDays = () => {
if (Interval.fromDateTimes(viewingDate(), DateTime.local()).isValid) {
if (challenge && challenge.challengeType) {
return Interval.fromDateTimes(viewingDate(), DateTime.local()).count(
'days'
)
} else {
return 0
}
} else {
if (challenge) {
return -Interval.fromDateTimes(DateTime.local(), viewingDate()).count(
'days'
)
} else {
return 0
}
}
}
const generateDayDash = (index: number, dayCount: number) => {
return (
<div
className={`date-dash ${
(index === 0 && dayCount > 0) ||
(index === getListOfWeeks().length - 1 && dayCount < 0)
? 'none'
: index * 7 < getListOfPastDays() + dayCount
? 'past'
: 'futur'
}`}
></div>
)
}
const monthChallenge = () => {
return getListOfWeeks().map((day, index) => (
<div key={index} className="day-solo">
<div className="day-line-label">
{generateDayDash(index, 3)}
{generateDayDash(index, 2)}
{generateDayDash(index, 1)}
<div
className={`date-label ${
index * 7 < getListOfPastDays() ? 'past' : 'futur'
}`}
></div>
{generateDayDash(index, -1)}
{generateDayDash(index, -2)}
{generateDayDash(index, -3)}
</div>
<div className="day-letter">{day.letter}</div>
<div className="day-date">{day.date}</div>
</div>
))
}
const weekChallenge = () => {
return getListOfDays().map((day, index) => (
<div key={index} className="day-solo">
<div className="day-line-label">
<div
className={`date-dash ${
index < getListOfPastDays() ? 'past' : 'futur'
}`}
></div>
<div
className={`date-label ${
index < getListOfPastDays() ? 'past' : 'futur'
}`}
></div>
<div
className={`date-dash ${
index + 1 < getListOfPastDays() ? 'past' : 'futur'
}`}
></div>
</div>
<div className="day-letter">{day.letter}</div>
<div className="day-date">{day.date}</div>
</div>
))
}
return (
<React.Fragment>
<div className="list-of-days-duration">
{challenge &&
challenge.challengeType &&
challenge.challengeType.duration.days === 7
? weekChallenge()
: monthChallenge()}
</div>
</React.Fragment>
)
}
export default translate()(FollowChallengeTimeline)