diff --git a/src/components/CommonKit/ErrorPage/ErrorPage.tsx b/src/components/CommonKit/ErrorPage/ErrorPage.tsx new file mode 100644 index 0000000000000000000000000000000000000000..30f17459f337b699d91e3f4cb650ef4d808132db --- /dev/null +++ b/src/components/CommonKit/ErrorPage/ErrorPage.tsx @@ -0,0 +1,61 @@ +import React, { useCallback, useState } from 'react' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import Content from 'components/Content/Content' +import CozyBar from 'components/Header/CozyBar' +import Header from 'components/Header/Header' +import BearIcon from 'assets/icons/visu/duelResult/CHALLENGE0001-0.svg' +import { Button } from '@material-ui/core' +import { useHistory } from 'react-router' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import './errorPage.scss' + +interface ErrorPageProps { + text: string + returnPage: string +} + +const ErrorPage: React.FC<ErrorPageProps> = ({ + text, + returnPage, +}: ErrorPageProps) => { + const history = useHistory() + const { t } = useI18n() + + const [headerHeight, setHeaderHeight] = useState<number>(0) + const defineHeaderHeight = (height: number) => { + setHeaderHeight(height) + } + const handleClick = useCallback(() => { + history.push(`/${returnPage}`) + }, [history, returnPage]) + return ( + <> + <CozyBar titleKey={'error_page.main'} /> + <Header + setHeaderHeight={defineHeaderHeight} + desktopTitleKey={'error_page.main'} + ></Header> + <Content height={headerHeight}> + <div className="error-container"> + <StyledIcon className="profile-icon" icon={BearIcon} size={250} /> + + <div className="text-18-bold head">{text}</div> + <Button + aria-label={t('error_page.back')} + onClick={handleClick} + variant={'contained'} + classes={{ + root: 'btn-highlight', + label: 'text-18-bold', + }} + type="submit" + > + {t('error_page.back')} + </Button> + </div> + </Content> + </> + ) +} + +export default ErrorPage diff --git a/src/components/CommonKit/ErrorPage/errorPage.scss b/src/components/CommonKit/ErrorPage/errorPage.scss new file mode 100644 index 0000000000000000000000000000000000000000..3724f53ad83c13f77cf694c5c5e83a154b2effd8 --- /dev/null +++ b/src/components/CommonKit/ErrorPage/errorPage.scss @@ -0,0 +1,15 @@ +@import 'src/styles/base/color'; + +.error-container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + max-width: 450px; + margin: auto; + padding: 2rem; + text-align: center; + .head { + color: $gold-shadow; + } +} diff --git a/src/components/Ecogesture/SingleEcogesture.tsx b/src/components/Ecogesture/SingleEcogesture.tsx index 229189b66cb529f65255a2706e69978c91823242..3ba0c5c3c818fa0c19917321d19e4f3ddcf7c41e 100644 --- a/src/components/Ecogesture/SingleEcogesture.tsx +++ b/src/components/Ecogesture/SingleEcogesture.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useCallback } from 'react' +import React, { useState, useEffect, useCallback, useMemo } from 'react' import './singleEcogesture.scss' import classNames from 'classnames' import { useI18n } from 'cozy-ui/transpiled/react/I18n' @@ -21,6 +21,9 @@ import Content from 'components/Content/Content' import CozyBar from 'components/Header/CozyBar' import Header from 'components/Header/Header' import { useClient } from 'cozy-client' +import ErrorPage from 'components/CommonKit/ErrorPage/ErrorPage' +import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' +import { FluidType } from 'enum/fluid.enum' interface SingleEcogestureProps { match: { params: { id: string } } @@ -36,8 +39,12 @@ const SingleEcogesture: React.FC<SingleEcogestureProps> = ({ const [isMoreDetail, setIsMoreDetail] = useState<boolean>(false) const [isDoing, setIsDoing] = useState<boolean>(false) const [isObjective, setIsObjective] = useState<boolean>(false) + const [isLoading, setIsLoading] = useState<boolean>(true) const ecogestureID: string = match.params.id + const ecogestureService = useMemo(() => new EcogestureService(client), [ + client, + ]) const { currentChallenge } = useSelector( (state: AppStore) => state.ecolyo.challenge ) @@ -49,25 +56,43 @@ const SingleEcogesture: React.FC<SingleEcogestureProps> = ({ const toggleMoreDetail = () => { setIsMoreDetail(prev => !prev) } - const toggleObjective = useCallback(() => { - setIsObjective(prev => !prev) - }, []) - const toggleDoing = useCallback(() => { - setIsDoing(prev => !prev) - }, []) + const toggleObjective = useCallback(async () => { + if (ecogesture) { + const toUpdate: Ecogesture = { ...ecogesture, objective: !isObjective } + const updatedEcogesture = await ecogestureService.updateEcogesture( + toUpdate + ) + if (updatedEcogesture) { + setIsObjective(prev => !prev) + setEcogesture(updatedEcogesture) + } + } + }, [ecogesture, ecogestureService, isObjective]) + + const toggleDoing = useCallback(async () => { + if (ecogesture) { + const toUpdate: Ecogesture = { ...ecogesture, doing: !isDoing } + const updatedEcogesture = await ecogestureService.updateEcogesture( + toUpdate + ) + if (updatedEcogesture) { + setIsDoing(prev => !prev) + setEcogesture(updatedEcogesture) + } + } + }, [ecogesture, ecogestureService, isDoing]) useEffect(() => { + setIsLoading(true) async function getSingleEcogesture() { - const ecogestureService = new EcogestureService(client) const data = await ecogestureService.getEcogesturesByIds([ecogestureID]) - if (data) { + if (data && data[0]) { setEcogesture(data[0]) + //Prevent case this key doesn't exist in doctype + setIsObjective(data[0].objective ? true : false) + setIsDoing(data[0].doing ? true : false) } } - getSingleEcogesture() - }, [client, ecogestureID]) - - useEffect(() => { async function handleEcogestureIcon() { if (ecogesture) { const icon = await importIconbyId(ecogesture.id, 'ecogesture') @@ -84,11 +109,25 @@ const SingleEcogesture: React.FC<SingleEcogestureProps> = ({ } } } + getSingleEcogesture() + .then(() => handleEcogestureIcon()) + .finally(() => { + setIsLoading(false) + }) + }, [ + client, + currentChallenge, + ecogesture, + ecogestureID, + ecogestureService, + setValidExploration, + ]) - handleEcogestureIcon() - }, [ecogesture, setValidExploration, currentChallenge]) - - return ( + return isLoading ? ( + <div className="loader-container"> + <StyledSpinner size="5em" fluidType={FluidType.MULTIFLUID} /> + </div> + ) : ecogesture ? ( <> <CozyBar titleKey={ecogesture && ecogesture.shortName} @@ -102,85 +141,85 @@ const SingleEcogesture: React.FC<SingleEcogestureProps> = ({ isNotKey={true} ></Header> <Content height={headerHeight}> - {ecogesture ? ( - <div className="single-ecogesture"> - <div className="icon-container"> - {ecogestureIcon && ( - <StyledIcon - className="icon-big" - icon={ecogestureIcon} - size={220} - /> - )} - </div> - <div className="details"> - <div className="efficiency"> - <span className="text text-14-normal"> - {t('ecogesture_modal.efficiency')} - </span> - <EfficientyRating result={Math.round(ecogesture.efficiency)} /> - </div> + <div className="single-ecogesture"> + <div className="icon-container"> + {ecogestureIcon && ( + <StyledIcon + className="icon-big" + icon={ecogestureIcon} + size={220} + /> + )} + </div> + <div className="details"> + <div className="efficiency"> + <span className="text text-14-normal"> + {t('ecogesture_modal.efficiency')} + </span> + <EfficientyRating result={Math.round(ecogesture.efficiency)} /> </div> - <div className="styled-container"> - <div className="long-name">{ecogesture.longName}</div> - <div - className={classNames('description text-16-normal-150', { - ['block']: isMoreDetail === true, - })} - > - {ecogesture.longDescription} - </div> - <div - className="toggle-text text-15-normal" - onClick={toggleMoreDetail} - > - {isMoreDetail - ? t('ecogesture_modal.show_less') - : t('ecogesture_modal.show_more')} - </div> + </div> + <div className="styled-container"> + <div className="long-name">{ecogesture.longName}</div> + <div + className={classNames('description text-16-normal-150', { + ['block']: isMoreDetail === true, + })} + > + {ecogesture.longDescription} </div> - <div className="buttons-selection"> - <IconButton - aria-label={t('ecogesture.objective')} - onClick={toggleObjective} - classes={{ - root: `btn-secondary-negative objective-btn ${isObjective && - 'active'}`, - label: 'text-15-normal', - }} - > - <Icon - className="status-icon" - icon={ - isObjective ? objectiveEnabledIcon : objectiveDisabledIcon - } - size={40} - /> - <span>{t('ecogesture.objective')}</span> - </IconButton> - <IconButton - aria-label={t('ecogesture.doing')} - onClick={toggleDoing} - classes={{ - root: `btn-secondary-negative doing-btn ${isDoing && - 'active'}`, - label: 'text-15-normal', - }} - > - <Icon - className="status-icon" - icon={isDoing ? doingEnabledIcon : doingDisabledIcon} - size={40} - /> - <span>{t('ecogesture.doing')}</span> - </IconButton> + <div + className="toggle-text text-15-normal" + onClick={toggleMoreDetail} + > + {isMoreDetail + ? t('ecogesture_modal.show_less') + : t('ecogesture_modal.show_more')} </div> </div> - ) : ( - "Oups cet ecogeste n'existe pas" - )} + <div className="buttons-selection"> + <IconButton + aria-label={t('ecogesture.objective')} + onClick={toggleObjective} + classes={{ + root: `btn-secondary-negative objective-btn ${isObjective && + 'active'}`, + label: 'text-15-normal', + }} + > + <Icon + className="status-icon" + icon={ + isObjective ? objectiveEnabledIcon : objectiveDisabledIcon + } + size={40} + /> + <span>{t('ecogesture.objective')}</span> + </IconButton> + <IconButton + aria-label={t('ecogesture.doing')} + onClick={toggleDoing} + classes={{ + root: `btn-secondary-negative doing-btn ${isDoing && 'active'}`, + label: 'text-15-normal', + }} + > + <Icon + className="status-icon" + icon={isDoing ? doingEnabledIcon : doingDisabledIcon} + size={40} + /> + <span>{t('ecogesture.doing')}</span> + </IconButton> + </div> + </div> </Content> </> + ) : ( + <ErrorPage + text={t('error_page.no_ecogesture')} + returnPage={'ecogestures'} + /> ) } diff --git a/src/components/Splash/SplashRoot.tsx b/src/components/Splash/SplashRoot.tsx index 97463335e8a959b89df7404d66e838dbbc4544bb..4848d7084e650192af85e339b65c5e459b5ba0f0 100644 --- a/src/components/Splash/SplashRoot.tsx +++ b/src/components/Splash/SplashRoot.tsx @@ -75,7 +75,7 @@ const SplashRoot = ({ splashEnd: false, splashStart: false, }) - const [error, setError] = useState<Error | null>(null) + const [error, setError] = useState<Error | any>(null) const dispatch: Dispatch< | ChallengeActionTypes | ChartActionTypes diff --git a/src/db/ecogestureData.json b/src/db/ecogestureData.json index a3d584127e2eb57e27f70a05dd376bf6e90ec57c..72a25a2c1d153a4e747f241a26f78fe056663aea 100644 --- a/src/db/ecogestureData.json +++ b/src/db/ecogestureData.json @@ -17,7 +17,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0002", @@ -37,7 +39,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0003", @@ -57,7 +61,9 @@ "investment": null, "action": true, "actionName": "Je ferme les portes entre les pièces chauffées et moins chauffées.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0004", @@ -77,7 +83,9 @@ "investment": null, "action": true, "actionName": "Je coupe l'eau de la douche pendant que je me savonne.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0005", @@ -97,7 +105,9 @@ "investment": null, "action": true, "actionName": "Je ferme l’eau du robinet quand je me lave les dents.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0006", @@ -117,7 +127,9 @@ "investment": null, "action": true, "actionName": "Je mets mon ordinateur en veille automatique au bout de 5/10min d'inactivité.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0007", @@ -137,7 +149,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0008", @@ -157,7 +171,9 @@ "investment": "Couvercle", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0009", @@ -177,7 +193,9 @@ "investment": null, "action": true, "actionName": "Je dépoussière mes radiateurs.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0010", @@ -197,7 +215,9 @@ "investment": null, "action": true, "actionName": "Je me lave les mains uniquement à l'eau froide.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0011", @@ -217,7 +237,9 @@ "investment": null, "action": true, "actionName": "Je rince ma vaisselle à l'eau froide.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0012", @@ -237,7 +259,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0013", @@ -257,7 +281,9 @@ "investment": null, "action": true, "actionName": "J’utilise le cycle court à basse température pour laver le linge et la vaisselle.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0014", @@ -277,7 +303,9 @@ "investment": null, "action": true, "actionName": "J’attends que les plats chauds aient refroidi avant de les mettre au réfrigérateur et je les couvre.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0015", @@ -297,7 +325,9 @@ "investment": null, "action": true, "actionName": "Je remets systématiquement mes mitigeurs sur la position la plus froide.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0016", @@ -317,7 +347,9 @@ "investment": null, "action": true, "actionName": "J’éteins systématiquement les lumières quand je sors d’une pièce.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0017", @@ -337,7 +369,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0018", @@ -357,7 +391,9 @@ "investment": null, "action": true, "actionName": "Je remplis complètement ma machine à laver et/ou mon lave-vaisselle avant de les faire tourner.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0019", @@ -377,7 +413,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0020", @@ -397,7 +435,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0021", @@ -417,7 +457,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0022", @@ -437,7 +479,9 @@ "investment": null, "action": true, "actionName": "Je nettoie le filtre de ma machine à laver.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0023", @@ -457,7 +501,9 @@ "investment": "Vinaigre blanc ou produit de détartrage", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0024", @@ -477,7 +523,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0025", @@ -497,7 +545,9 @@ "investment": null, "action": true, "actionName": "Je nettoie mes ampoules et luminaires.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0026", @@ -517,7 +567,9 @@ "investment": null, "action": true, "actionName": "J’ouvre mes rideaux et mes volets dès qu’il fait jour et privilégie les apports de lumière naturelle.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0027", @@ -537,7 +589,9 @@ "investment": null, "action": true, "actionName": "Je débranche mes chargeurs quand ils ne sont pas en fonctionnement.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0028", @@ -557,7 +611,9 @@ "investment": null, "action": true, "actionName": "Je réfléchis à ce que je vais prendre avant d’ouvrir la porte de mon appareil de froid.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0029", @@ -577,7 +633,9 @@ "investment": null, "action": true, "actionName": "J'adapte le programme d'essorage de ma machine à laver au type de linge.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0030", @@ -597,7 +655,9 @@ "investment": null, "action": true, "actionName": "J’optimise le rangement dans mon réfrigérateur et/ou congélateur.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0031", @@ -617,7 +677,9 @@ "investment": null, "action": true, "actionName": "Je décide de baisser de 2 °C la température de chauffage de mes pièces.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0032", @@ -637,7 +699,9 @@ "investment": "Thermostat (d’ambiance)", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0033", @@ -657,7 +721,9 @@ "investment": "Thermostat d’ambiance", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0034", @@ -677,7 +743,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0035", @@ -697,7 +765,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0036", @@ -717,7 +787,9 @@ "investment": null, "action": true, "actionName": "Je met mon chauffage en mode réduit pendant la nuit ou pendant mon absence.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0037", @@ -737,7 +809,9 @@ "investment": null, "action": true, "actionName": "Je décide de baisser d'1 °C la température de chauffage de mes pièces.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0038", @@ -757,7 +831,9 @@ "investment": null, "action": true, "actionName": "Je ne chauffe que les pièces de vie (salon, cuisine, …)", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0039", @@ -777,7 +853,9 @@ "investment": "Boudins de portes", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0040", @@ -797,7 +875,9 @@ "investment": null, "action": true, "actionName": "Je prends des douches de moins de 5 minutes.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0041", @@ -817,7 +897,9 @@ "investment": "Eco mousseur", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0042", @@ -837,7 +919,9 @@ "investment": "Eco mousseur", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0043", @@ -857,7 +941,9 @@ "investment": null, "action": true, "actionName": "Je conserve au maximum la fraicheur de mon logement en fermant les volets et fenêtres quand je m’absente pendant la journée.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0044", @@ -877,7 +963,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0045", @@ -897,7 +985,9 @@ "investment": "Seau/ Bac de récupération", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0046", @@ -917,7 +1007,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0047", @@ -937,7 +1029,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0048", @@ -957,7 +1051,9 @@ "investment": "Multiprise avec interrupteur marche/arrêt", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0049", @@ -977,7 +1073,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0050", @@ -997,7 +1095,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0051", @@ -1017,7 +1117,9 @@ "investment": null, "action": true, "actionName": "Je diminue la luminosité de mon écran d’ordinateur tout en conservant un confort de vue.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0052", @@ -1037,7 +1139,9 @@ "investment": "Etendage", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0053", @@ -1057,7 +1161,9 @@ "investment": "Multiprise avec interrupteur marche/arrêt", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0054", @@ -1077,7 +1183,9 @@ "investment": "Ampoules basses consommation", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0055", @@ -1097,7 +1205,9 @@ "investment": null, "action": true, "actionName": "Je remplis mon congélateur, je ne surcharge pas mon réfrigérateur.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0056", @@ -1117,7 +1227,9 @@ "investment": "un bac à vaiselle", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0057", @@ -1137,7 +1249,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0058", @@ -1157,7 +1271,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0059", @@ -1177,7 +1293,9 @@ "investment": "-", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0060", @@ -1197,7 +1315,9 @@ "investment": null, "action": true, "actionName": "Je dégivre mon réfrigérateur et/ou congélateur.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0061", @@ -1217,7 +1337,9 @@ "investment": "Thermomètre", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0062", @@ -1237,7 +1359,9 @@ "investment": null, "action": true, "actionName": "Je nettoie la grille arrière de mon réfrigérateur.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0063", @@ -1257,7 +1381,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0064", @@ -1277,7 +1403,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0065", @@ -1297,7 +1425,9 @@ "investment": "Volet/Rideau", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0066", @@ -1317,7 +1447,9 @@ "investment": "Faire appel à un pro", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0067", @@ -1337,7 +1469,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0068", @@ -1357,7 +1491,9 @@ "investment": "Faire appel à un pro", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0069", @@ -1377,7 +1513,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0070", @@ -1397,7 +1535,9 @@ "investment": "Faire appel à un pro", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0071", @@ -1417,7 +1557,9 @@ "investment": "Panneau réfléchissant", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0072", @@ -1437,7 +1579,9 @@ "investment": "Isolant", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0073", @@ -1457,7 +1601,9 @@ "investment": "Faire appel à un pro", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0074", @@ -1477,7 +1623,9 @@ "investment": "Chasse d’eau à double vitesse: à faire si travaux", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0075", @@ -1497,7 +1645,9 @@ "investment": null, "action": true, "actionName": "Je décide de supprimer une douche pendant la durée du défi.", - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0076", @@ -1517,7 +1667,9 @@ "investment": null, "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false }, { "_id": "ECOGESTURE0077", @@ -1537,6 +1689,8 @@ "investment": "Travaux de décoration", "action": false, "actionName": null, - "actionDuration": 3 + "actionDuration": 3, + "doing": false, + "objective": false } ] diff --git a/src/locales/fr.json b/src/locales/fr.json index ce9b3c049bac35c74ab0db7c5c171eb28993a1a6..f680c9565f1125020d82ba0d275b98392bbcd328 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -406,6 +406,11 @@ "button_start": "Lancer l'exploration" } }, + "error_page": { + "main": "Erreur", + "back": "Retour", + "no_ecogesture": "Oups ! Nous n'avons pas trouvé l'écogeste demandé." + }, "faq": { "title_faq": "Foire aux questions", "read_faq": "Lire la FAQ", diff --git a/src/models/ecogesture.model.ts b/src/models/ecogesture.model.ts index ef3fbfc276a19b36cbe21dff82853fc223db1e69..07d86ad5334011eecf014b616d0a2be7f58f84ca 100644 --- a/src/models/ecogesture.model.ts +++ b/src/models/ecogesture.model.ts @@ -20,6 +20,8 @@ export interface Ecogesture { action: boolean actionName: string | null actionDuration: number + objective: boolean + doing: boolean _id: string _rev?: string _type?: string diff --git a/src/services/ecogesture.service.ts b/src/services/ecogesture.service.ts index bc1eb9018e26d8ce6ee617d9e94908e479ee71b2..5ce03fe1e1896ee8bd0429fad19a2ea7cdfbf8df 100644 --- a/src/services/ecogesture.service.ts +++ b/src/services/ecogesture.service.ts @@ -14,12 +14,17 @@ export default class EcogestureService { this._client = _client } - public async getAllEcogestures(seasonFilter?: Season): Promise<Ecogesture[]> { + public async getAllEcogestures( + seasonFilter?: Season, + orderByID?: boolean + ): Promise<Ecogesture[]> { let query: QueryDefinition = Q(ECOGESTURE_DOCTYPE) if (seasonFilter && seasonFilter !== Season.NONE) { query = query .where({ season: { $ne: seasonFilter } }) .sortBy([{ season: 'desc' }]) + } else if (orderByID) { + query = query.where({}).sortBy([{ _id: 'asc' }]) } else { query = query.where({}).sortBy([{ season: 'desc' }]) } @@ -140,4 +145,15 @@ export default class EcogestureService { ) return filteredEcogestureList } + /** + * Update one ecogesture + * @param {Ecogesture} ecogesture - Ecogesture to save + * @returns {Ecogesture} Udpated Ecogesture + */ + public async updateEcogesture(ecogesture: Ecogesture): Promise<Ecogesture> { + const { + data: updatedEcogesture, + }: QueryResult<Ecogesture> = await this._client.save(ecogesture) + return updatedEcogesture + } } diff --git a/src/services/initialization.service.ts b/src/services/initialization.service.ts index dcee9ea981ff4f218e482ae90cca77b901b7c91f..e79f3a2bb99ac2c078167fb56b8e33c135847f90 100644 --- a/src/services/initialization.service.ts +++ b/src/services/initialization.service.ts @@ -2,7 +2,6 @@ import { Client, Q, QueryDefinition } from 'cozy-client' import { ECOGESTURE_DOCTYPE, PROFILE_DOCTYPE, - PROFILETYPE_DOCTYPE, EGL_DAY_DOCTYPE, EGL_MONTH_DOCTYPE, EGL_YEAR_DOCTYPE, @@ -200,7 +199,10 @@ export default class InitializationService { const hashEcogestureType = hashFile(ecogestureData) const ecogestureService = new EcogestureService(this._client) // Populate data if none ecogesture exists - const loadedEcogestures = await ecogestureService.getAllEcogestures() + const loadedEcogestures = await ecogestureService.getAllEcogestures( + undefined, + true + ) if ( !loadedEcogestures || (loadedEcogestures && loadedEcogestures.length === 0) @@ -220,23 +222,30 @@ export default class InitializationService { 'initEcogesture: Created ecogesture type entities does not match' ) } - log.info('[Initialization] Ecogesture created') + log.info('[Initialization] Ecogesture list created') return hashEcogestureType } catch (error) { log.error('Initialization error - initEcogesture: ', error) throw error } } - // Update if the hash is not the same as the one from profile if (hash !== hashEcogestureType) { // Update the doctype try { + loadedEcogestures // Deletion of all documents await ecogestureService.deleteAllEcogestures() // Population with the data - for (const ecogesture of ecogestureData) { - await this._client.create(ECOGESTURE_DOCTYPE, ecogesture) + for (const [index, ecogesture] of ecogestureData.entries()) { + const updateEcogesture = loadedEcogestures[index] + ? { + ...ecogesture, + objective: loadedEcogestures[index].objective ? true : false, + doing: loadedEcogestures[index].doing ? true : false, + } + : ecogesture + await this._client.create(ECOGESTURE_DOCTYPE, updateEcogesture) } // Check of created document based on count const checkCount = await ecogestureService.getAllEcogestures() @@ -256,7 +265,7 @@ export default class InitializationService { } } else { // Doctype already up to date - log.info('[Initialization] Ecogesture loaded') + log.info('[Initialization] Ecogesture already up-to-date') return hashEcogestureType } } diff --git a/tests/__mocks__/actionData.mock.ts b/tests/__mocks__/actionData.mock.ts index 65c0a353861dc1f07e6500257f03fa920ef38f93..d4c4ba2af35250894a3410e61850297789baec4e 100644 --- a/tests/__mocks__/actionData.mock.ts +++ b/tests/__mocks__/actionData.mock.ts @@ -24,6 +24,8 @@ export const defaultEcogestureData: Ecogesture[] = [ action: true, actionName: "Je me lave les mains uniquement à l'eau froide.", actionDuration: 3, + doing: false, + objective: false, }, { _id: 'ECOGESTURE0014', @@ -49,6 +51,8 @@ export const defaultEcogestureData: Ecogesture[] = [ actionName: 'J’attends que les plats chauds aient refroidi avant de les mettre au réfrigérateur et je les couvre.', actionDuration: 3, + doing: false, + objective: false, }, { id: 'ECOGESTURE0030', @@ -73,6 +77,8 @@ export const defaultEcogestureData: Ecogesture[] = [ actionName: 'J’optimise le rangement dans mon réfrigérateur et/ou congélateur.', actionDuration: 3, + doing: false, + objective: false, }, ] @@ -97,6 +103,8 @@ export const ecogestureDefault: Ecogesture = { action: true, actionName: "Je me lave les mains uniquement à l'eau froide.", actionDuration: 3, + doing: false, + objective: false, } export const AllEcogestureData: Ecogesture[] = [ @@ -122,6 +130,8 @@ export const AllEcogestureData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, }, { _id: 'ECOGESTURE0002', @@ -144,6 +154,8 @@ export const AllEcogestureData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, }, { _id: 'ECOGESTURE0003', @@ -168,6 +180,8 @@ export const AllEcogestureData: Ecogesture[] = [ actionName: 'Je ferme les portes entre les pièces chauffées et moins chauffées.', actionDuration: 3, + doing: false, + objective: false, }, { _id: 'ECOGESTURE0004', @@ -190,6 +204,8 @@ export const AllEcogestureData: Ecogesture[] = [ action: true, actionName: "Je coupe l'eau de la douche pendant que je me savonne.", actionDuration: 3, + doing: false, + objective: false, }, { _id: 'ECOGESTURE0005', @@ -212,6 +228,8 @@ export const AllEcogestureData: Ecogesture[] = [ action: true, actionName: 'Je ferme l’eau du robinet quand je me lave les dents.', actionDuration: 3, + doing: false, + objective: false, }, { _id: 'ECOGESTURE0006', @@ -234,5 +252,7 @@ export const AllEcogestureData: Ecogesture[] = [ action: true, actionName: 'Je dépoussière mes radiateurs.', actionDuration: 3, + doing: false, + objective: false, }, ] diff --git a/tests/__mocks__/ecogesturesData.mock.ts b/tests/__mocks__/ecogesturesData.mock.ts index 7b055ffe213bfc903d1056966f33e9097284f00e..dd9605dd532993d13a153238ed197edd06ed7305 100644 --- a/tests/__mocks__/ecogesturesData.mock.ts +++ b/tests/__mocks__/ecogesturesData.mock.ts @@ -24,6 +24,8 @@ export const ecogesturesData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, _id: 'ECOGESTURE001', _rev: '1-67f1ea36efdd892c96bf64a8943154cd', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -48,6 +50,8 @@ export const ecogesturesData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, _id: 'ECOGESTURE002', _rev: '1-ef7ddd778254e3b7d331a88fd17f606d', @@ -75,6 +79,8 @@ export const ecogesturesData: Ecogesture[] = [ actionName: 'J’utilise le cycle court à basse température pour laver le linge et la vaisselle.', actionDuration: 3, + doing: false, + objective: false, _id: 'ECOGESTURE0013', _rev: '1-0b2761dd4aef79556c7aef144060fde6', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -103,6 +109,8 @@ export const ecogesturesHeatingData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, _id: 'ECOGESTURE001', _rev: '1-67f1ea36efdd892c96bf64a8943154cd', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -127,6 +135,8 @@ export const ecogesturesHeatingData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, _id: 'ECOGESTURE002', _rev: '1-ef7ddd778254e3b7d331a88fd17f606d', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -153,7 +163,8 @@ export const ecogesturesHeatingData: Ecogesture[] = [ actionName: 'J’utilise le cycle court à basse température pour laver le linge et la vaisselle.', actionDuration: 3, - + doing: false, + objective: false, _id: 'ECOGESTURE0013', _rev: '1-0b2761dd4aef79556c7aef144060fde6', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -182,6 +193,8 @@ export const ecogesturesECSData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, _id: 'ECOGESTURE001', _rev: '1-67f1ea36efdd892c96bf64a8943154cd', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -206,6 +219,8 @@ export const ecogesturesECSData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, _id: 'ECOGESTURE002', _rev: '1-ef7ddd778254e3b7d331a88fd17f606d', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -233,7 +248,8 @@ export const ecogesturesECSData: Ecogesture[] = [ actionName: 'J’utilise le cycle court à basse température pour laver le linge et la vaisselle.', actionDuration: 3, - + doing: false, + objective: false, _id: 'ECOGESTURE0013', _rev: '1-0b2761dd4aef79556c7aef144060fde6', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -262,6 +278,8 @@ export const ecogesturesCookingData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, _id: '001', _rev: '1-67f1ea36efdd892c96bf64a8943154cd', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -286,7 +304,8 @@ export const ecogesturesCookingData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, - + doing: false, + objective: false, _id: '002', _rev: '1-ef7ddd778254e3b7d331a88fd17f606d', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -313,6 +332,8 @@ export const ecogesturesCookingData: Ecogesture[] = [ actionName: 'J’utilise le cycle court à basse température pour laver le linge et la vaisselle.', actionDuration: 3, + doing: false, + objective: false, _id: '0013', _rev: '1-0b2761dd4aef79556c7aef144060fde6', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -339,6 +360,8 @@ export const ecogesturesCookingData: Ecogesture[] = [ actionName: 'J’attends que les plats chauds aient refroidi avant de les mettre au réfrigérateur et je les couvre.', actionDuration: 3, + doing: false, + objective: false, _id: '0014', _rev: '1-0b2761dd4aef79556c7aef144060fde6', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -367,6 +390,8 @@ export const ecogesturesElecSpecificData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, _id: '001', _rev: '1-67f1ea36efdd892c96bf64a8943154cd', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -391,6 +416,8 @@ export const ecogesturesElecSpecificData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, _id: '002', _rev: '1-ef7ddd778254e3b7d331a88fd17f606d', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -417,6 +444,8 @@ export const ecogesturesElecSpecificData: Ecogesture[] = [ actionName: 'J’utilise le cycle court à basse température pour laver le linge et la vaisselle.', actionDuration: 3, + doing: false, + objective: false, _id: '0013', _rev: '1-0b2761dd4aef79556c7aef144060fde6', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -445,6 +474,8 @@ export const ecogesturesAirConditioningData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, _id: '001', _rev: '1-67f1ea36efdd892c96bf64a8943154cd', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -469,6 +500,8 @@ export const ecogesturesAirConditioningData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, _id: '002', _rev: '1-ef7ddd778254e3b7d331a88fd17f606d', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -495,7 +528,8 @@ export const ecogesturesAirConditioningData: Ecogesture[] = [ actionName: 'J’utilise le cycle court à basse température pour laver le linge et la vaisselle.', actionDuration: 3, - + doing: false, + objective: false, _id: '0013', _rev: '1-0b2761dd4aef79556c7aef144060fde6', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -524,7 +558,8 @@ export const ecogesturesColdWaterData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, - + doing: false, + objective: false, _id: '001', _rev: '1-67f1ea36efdd892c96bf64a8943154cd', _type: 'com.grandlyon.ecolyo.ecogesture', @@ -549,6 +584,8 @@ export const ecogesturesColdWaterData: Ecogesture[] = [ action: false, actionName: null, actionDuration: 3, + doing: false, + objective: false, _id: '002', _rev: '1-ef7ddd778254e3b7d331a88fd17f606d', _type: 'com.grandlyon.ecolyo.ecogesture',