From 6e6a031c1dbd081e4669c55f704483516812695c Mon Sep 17 00:00:00 2001 From: Romain CREY <ext.sopra.rcrey@grandlyon.com> Date: Tue, 2 Jun 2020 14:42:50 +0200 Subject: [PATCH] feat: 4 weeks challenge + fix level + fix badge error + fully locked challenge --- .../FinishedChallengeDetailsViewContainer.tsx | 37 ++++++++++------ .../LockedChallengeDetailsViewContainer.tsx | 4 +- .../Challenge/FollowChallengeTimeline.tsx | 43 ++++++++++++++++--- .../ChallengeList/ChallengeListItem.tsx | 13 ++++-- .../ChallengeList/ChallengesList.tsx | 16 ++++--- .../ChallengeModal/ChallengeModal.tsx | 29 ++++++++++--- src/db/challengeTypeData.json | 14 +++--- src/locales/en.json | 1 + src/services/challengeDataManagerService.ts | 18 +++++--- src/styles/components/_challenges.scss | 11 ++++- src/styles/components/_ecogesture.scss | 12 +++--- 11 files changed, 141 insertions(+), 57 deletions(-) diff --git a/src/components/ContainerComponents/ViewContainer/FinishedChallengeDetailsViewContainer.tsx b/src/components/ContainerComponents/ViewContainer/FinishedChallengeDetailsViewContainer.tsx index 92a2ae276..8be12a7ec 100644 --- a/src/components/ContainerComponents/ViewContainer/FinishedChallengeDetailsViewContainer.tsx +++ b/src/components/ContainerComponents/ViewContainer/FinishedChallengeDetailsViewContainer.tsx @@ -37,10 +37,15 @@ const FinishedChallengeDetailsViewContainer: React.FC<FinishedChallengeDetailsVi const { screenType } = useContext(AppContext) async function importRightBadge(id: string, badgeStatus: number) { - // Les svg doivent être au format idchallenge-badgestate.svg - const importedBadge = await import( - /* webpackMode: "eager" */ `assets/png/badges/${id}-${badgeStatus}.png` - ) + // Les png doivent être au format idchallenge-badgestate.png + const importedBadge = + id === 'CHA00000001' + ? await import( + /* webpackMode: "eager" */ `assets/png/badges/${id}-1.png` + ) + : await import( + /* webpackMode: "eager" */ `assets/png/badges/${id}-${badgeStatus}.png` + ) setBadgeIcon(importedBadge.default) } @@ -111,20 +116,26 @@ const FinishedChallengeDetailsViewContainer: React.FC<FinishedChallengeDetailsVi </div> ) ) : null} - <div className="cp-win-badge-star"> - <img - className="cp-win-badge" - src={badgeIcon} - width={screenType === ScreenType.MOBILE ? 200 : 300} - ></img> - {challenge.badge === BadgeState.SUCCESS ? ( + {challenge.badge === BadgeState.SUCCESS ? ( + <div className="cp-win-badge-star"> + <img + className="cp-win-badge" + src={badgeIcon} + width={screenType === ScreenType.MOBILE ? 200 : 300} + ></img> <img className="cp-win-star" src={StarIcon} width={screenType === ScreenType.MOBILE ? 380 : 480} ></img> - ) : null} - </div> + </div> + ) : ( + <img + className="cp-win-badge" + src={badgeIcon} + width={screenType === ScreenType.MOBILE ? 200 : 300} + ></img> + )} <div className="cp-description text-16-bold"> {challenge.challengeType && challenge.challengeType.description} diff --git a/src/components/ContainerComponents/ViewContainer/LockedChallengeDetailsViewContainer.tsx b/src/components/ContainerComponents/ViewContainer/LockedChallengeDetailsViewContainer.tsx index 2fcdca083..36ee470b0 100644 --- a/src/components/ContainerComponents/ViewContainer/LockedChallengeDetailsViewContainer.tsx +++ b/src/components/ContainerComponents/ViewContainer/LockedChallengeDetailsViewContainer.tsx @@ -65,7 +65,9 @@ const LockedChallengeDetailsViewContainer: React.FC<LockedChallengeDetailsViewPr width={screenType === ScreenType.MOBILE ? 180 : 220} ></img> <div className="cp-description text-16-bold"> - {t('CHALLENGE.LOCKED')} + {challenge.level < 900 + ? t('CHALLENGE.LOCKED') + : t('CHALLENGE.FULLY_LOCKED')} </div> </div> <div className="cp-valid-locked"> diff --git a/src/components/ContentComponents/Challenge/FollowChallengeTimeline.tsx b/src/components/ContentComponents/Challenge/FollowChallengeTimeline.tsx index ff67a7123..306b1763f 100644 --- a/src/components/ContentComponents/Challenge/FollowChallengeTimeline.tsx +++ b/src/components/ContentComponents/Challenge/FollowChallengeTimeline.tsx @@ -35,12 +35,24 @@ const FollowChallengeTimeline: React.FC<FollowChallengeTimelineViewProps> = ({ const startingDate = DateTime.fromISO(challenge.startingDate.toString()) const listOfChallengeDays = [] let i = 0 - while (challenge.challengeType.duration.days > i) { - listOfChallengeDays.push({ - letter: startingDate.plus({ days: i }).weekdayShort[0].toUpperCase(), - date: startingDate.plus({ days: i }).day, - }) - i++ + 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 { @@ -50,10 +62,27 @@ const FollowChallengeTimeline: React.FC<FollowChallengeTimelineViewProps> = ({ const getListOfPastDays = () => { if (Interval.fromDateTimes(viewingDate(), DateTime.local()).isValid) { - if (challenge && challenge.challengeType) { + if ( + challenge && + challenge.challengeType && + challenge.challengeType.duration.days === 7 + ) { return Interval.fromDateTimes(viewingDate(), DateTime.local()).count( 'days' ) + } else if ( + challenge && + challenge.challengeType && + challenge.challengeType.duration.days === 28 + ) { + console.log( + Interval.fromDateTimes(viewingDate(), DateTime.local()).count('days') + ) + return ( + Interval.fromDateTimes(viewingDate(), DateTime.local()).count( + 'days' + ) / 7 + ) } else { return 0 } diff --git a/src/components/ContentComponents/ChallengeList/ChallengeListItem.tsx b/src/components/ContentComponents/ChallengeList/ChallengeListItem.tsx index 6dfd81a72..c533747de 100644 --- a/src/components/ContentComponents/ChallengeList/ChallengeListItem.tsx +++ b/src/components/ContentComponents/ChallengeList/ChallengeListItem.tsx @@ -33,10 +33,15 @@ const ChallengeListItem: React.FC<ChallengeListItemProps> = ({ const [badgeIcon, setBadgeIcon] = useState<any | null>(null) async function importRightBadge(id: string, badgeStatus: number) { - // Les svg doivent être au format idchallenge-badgestate.svg - const importedBadge = await import( - /* webpackMode: "eager" */ `assets/png/badges/${id}-${badgeStatus}.png` - ) + // Les png doivent être au format idchallenge-badgestate.png + const importedBadge = + id === 'CHA00000001' + ? await import( + /* webpackMode: "eager" */ `assets/png/badges/${id}-1.png` + ) + : await import( + /* webpackMode: "eager" */ `assets/png/badges/${id}-${badgeStatus}.png` + ) setBadgeIcon(importedBadge.default) } diff --git a/src/components/ContentComponents/ChallengeList/ChallengesList.tsx b/src/components/ContentComponents/ChallengeList/ChallengesList.tsx index 0a7180cc8..46c71e6a2 100644 --- a/src/components/ContentComponents/ChallengeList/ChallengesList.tsx +++ b/src/components/ContentComponents/ChallengeList/ChallengesList.tsx @@ -36,6 +36,7 @@ const ChallengesList: React.FC<ChallengesListProps> = ({ const [openChallengeModal, setOpenChallengeModal] = useState(false) const [scroll, setScroll] = useState(0) const [paddingBottom, setPaddingBottom] = useState(0) + const [userLevel, setUserLevel] = useState<null | number>(null) const handleCloseClick = () => { setOngoingChallenge(null) @@ -87,8 +88,8 @@ const ChallengesList: React.FC<ChallengesListProps> = ({ fluidTypes ) const dataAllUC = await challengeManager.getAllUserChallenges() - - if (subscribed && dataAllCT && dataAllUC) { + const levelOfUser = await challengeManager.getUserLevel() + if (subscribed && dataAllCT && dataAllUC && levelOfUser) { const ongoingChallengeTmp = dataAllUC.filter( challenge => challenge.state === ChallengeState.ONGOING )[0] @@ -96,7 +97,7 @@ const ChallengesList: React.FC<ChallengesListProps> = ({ setChallengesType(dataAllCT) setUserChallenges(dataAllUC) setOngoingChallenge(ongoingChallengeTmp) - + setUserLevel(levelOfUser) if ( await challengeManager.isChallengeOver( ongoingChallengeTmp, @@ -122,10 +123,12 @@ const ChallengesList: React.FC<ChallengesListProps> = ({ fluidTypes ) const dataAllUC = await challengeManager.getAllUserChallenges() - if (subscribed && dataAllCT && dataAllUC) { + const levelOfUser = await challengeManager.getUserLevel() + if (subscribed && dataAllCT && dataAllUC && levelOfUser) { setChallengesType(dataAllCT) setUserChallenges(dataAllUC) setRightChallengeInTheMiddle(dataAllCT, dataAllUC) + setUserLevel(levelOfUser) } } loadNewChallengesType() @@ -154,7 +157,10 @@ const ChallengesList: React.FC<ChallengesListProps> = ({ style={{ paddingBottom: paddingBottom }} > {challengesType.map((challenge, index) => - index === challengesType.length - 1 && !ongoingChallenge ? ( + index === challengesType.length - 1 && + !ongoingChallenge && + userLevel === + challengesType[challengesType.length - 1].level ? ( <ChallengeListItem key={index} challenge={challenge} diff --git a/src/components/ContentComponents/ChallengeModal/ChallengeModal.tsx b/src/components/ContentComponents/ChallengeModal/ChallengeModal.tsx index 34bf9aae7..b1456acf4 100644 --- a/src/components/ContentComponents/ChallengeModal/ChallengeModal.tsx +++ b/src/components/ContentComponents/ChallengeModal/ChallengeModal.tsx @@ -29,10 +29,15 @@ const ChallengeModal: React.FC<ChallengeModalProps> = ({ const { screenType } = useContext(AppContext) async function importRightBadge(id: string, badgeStatus: number) { - // Les svg doivent être au format idchallenge-badgestate.svg - const importedBadge = await import( - /* webpackMode: "eager" */ `assets/png/badges/${id}-${badgeStatus}.png` - ) + // Les png doivent être au format idchallenge-badgestate.png + const importedBadge = + id === 'CHA00000001' + ? await import( + /* webpackMode: "eager" */ `assets/png/badges/${id}-1.png` + ) + : await import( + /* webpackMode: "eager" */ `assets/png/badges/${id}-${badgeStatus}.png` + ) setBadgeIcon(importedBadge.default) } @@ -56,10 +61,20 @@ const ChallengeModal: React.FC<ChallengeModalProps> = ({ {t('CHALLENGE.CONGRATULATION')} </div> <div className="cm-result text-18-bold"> - <div>{t('CHALLENGE.RESULT_POSITIF')}</div> - <div className="cm-result-positif text-18-normal">{`${result} €`}</div> + {challengeId !== 'CHA00000001' ? ( + <> + <div>{t('CHALLENGE.RESULT_POSITIF')}</div> + <div className="cm-result-positif text-18-normal">{`${result} €`}</div> + </> + ) : null} </div> - <div className="cm-win-badge-star"> + <div + className={ + challengeId !== 'CHA00000001' + ? 'cm-win-badge-star' + : 'cm-win-badge-star --ecolyo-royal' + } + > <img className="cm-win-badge" src={badgeIcon} diff --git a/src/db/challengeTypeData.json b/src/db/challengeTypeData.json index 7ab6a42b4..028b6669b 100644 --- a/src/db/challengeTypeData.json +++ b/src/db/challengeTypeData.json @@ -48,10 +48,10 @@ { "_id": "CHA00000003", "type": 0, - "title": "Winter is leaving", - "description": "Et si dans les 7 prochains jours vous réussissiez à consommer moins que dans les 7 derniers", + "title": "Méga Coques en stock", + "description": "Et si dans les 4 prochaines semaines vous réussissiez à consommer moins que dans les 4 dernières", "level": 3, - "duration": { "days": 7 }, + "duration": { "days": 28 }, "fluidTypes": [0, 1, 2], "relationships": { "availableEcogestures": { @@ -77,9 +77,9 @@ { "_id": "CHA00000004", "type": 0, - "title": "Mega Coques en stock", + "title": "Winter is leaving", "description": "Et si dans les 7 prochains jours vous réussissiez à consommer moins que dans les 7 derniers", - "level": 4, + "level": 901, "duration": { "days": 7 }, "fluidTypes": [0, 1, 2], "relationships": { @@ -106,9 +106,9 @@ { "_id": "CHA00000005", "type": 0, - "title": "Giga Coques en stock", + "title": "Méga Winter is leaving", "description": "Et si dans les 7 prochains jours vous réussissiez à consommer moins que dans les 7 derniers", - "level": 5, + "level": 902, "duration": { "days": 7 }, "fluidTypes": [0, 1, 2], "relationships": { diff --git a/src/locales/en.json b/src/locales/en.json index a727191ac..cf8a61c9a 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -140,6 +140,7 @@ "ONGOING_CHALLENGE": "En cours", "ENDINGDATE_UNDEFINED": "Date non connue", "LOCKED": "Vous devez finir le défi précédent pour accéder à celui-ci", + "FULLY_LOCKED": "Ce défi sera disponible dans une prochaine mise à jour", "START": "Allons-y !", "NOT_NOW": "Pas maintenant !", "STOP": "Arrêter le défi", diff --git a/src/services/challengeDataManagerService.ts b/src/services/challengeDataManagerService.ts index c00456c30..6da8ff4b8 100644 --- a/src/services/challengeDataManagerService.ts +++ b/src/services/challengeDataManagerService.ts @@ -202,16 +202,14 @@ export default class ChallengeManager implements IChallengeManager { return 0 } - public async updateUserLevel(level?: number) { + public async updateUserLevel(level: number) { await this._client .query(this._client.find(USERPROFILE_DOCTYPE).limitBy(1)) .then(async ({ data }) => { const doc = data[0] - let actualLevel = 0 - if (level) { + let actualLevel = doc.level + if (level > actualLevel) { actualLevel = level - } else { - actualLevel = doc.level } await this._client.save({ ...doc, @@ -445,6 +443,16 @@ export default class ChallengeManager implements IChallengeManager { return challengeTypes } + public async getUserLevel() { + let userLevel + await this._client + .query(this._client.find(USERPROFILE_DOCTYPE).limitBy(1)) + .then(async ({ data }) => { + userLevel = data[0].level + }) + return userLevel + } + public async startChallenge( challenge: ChallengeType, fluidTypes: FluidType[], diff --git a/src/styles/components/_challenges.scss b/src/styles/components/_challenges.scss index d602b791d..93e20d628 100644 --- a/src/styles/components/_challenges.scss +++ b/src/styles/components/_challenges.scss @@ -238,8 +238,15 @@ position: absolute; top: 15px; @media #{$large-phone} { - top: 65px; - } + top: 65px; + } + &.--ecolyo-royal { + @extend .cp-content; + top: -38px; + @media #{$large-phone} { + top: 12px; + } + } .cm-win-badge { grid-column: 1; grid-row: 1; diff --git a/src/styles/components/_ecogesture.scss b/src/styles/components/_ecogesture.scss index b5900788c..99d303bdb 100644 --- a/src/styles/components/_ecogesture.scss +++ b/src/styles/components/_ecogesture.scss @@ -54,7 +54,7 @@ display: flex; flex-direction: column; align-items: center; - justify-content: flex-end; + justify-content: space-around; &.ec-content-unlocked { padding: 0.4rem 0; } @@ -64,11 +64,11 @@ .ec-content-icon{ min-height: 50px; } - .ec-content-challenge-text { - display: flex; - flex: 1; - align-items: center; - } + // .ec-content-challenge-text { + // display: flex; + // flex: 1; + // align-items: center; + // } .ec-content-short-name { display: flex; flex: 1; -- GitLab