diff --git a/.eslintrc.js b/.eslintrc.js index d463b1af434adc17f24ef1ccf9bee0270c49378b..4d604c901b60280cffb38ec3f550d01b84bbda2f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -29,6 +29,7 @@ module.exports = { 'no-console': 'off', '@typescript-eslint/no-explicit-any': 'warn', '@typescript-eslint/prefer-optional-chain': 'warn', + 'react/self-closing-comp': 'warn', }, settings: { react: { diff --git a/src/components/Action/ActionOnGoing.tsx b/src/components/Action/ActionOnGoing.tsx index 16e4379b858860c7d902a90d49ccc36f25beb049..8627d2e829103a606d1aad326bc89189d555cfc4 100644 --- a/src/components/Action/ActionOnGoing.tsx +++ b/src/components/Action/ActionOnGoing.tsx @@ -92,7 +92,7 @@ const ActionOnGoing: React.FC<ActionOnGoingProps> = ({ style={{ backgroundImage: `${setGradient()}`, }} - ></div> + /> </div> <div className="result-title text-18-bold"> {t('action.result')}</div> <div className="result-date text-24-bold">{getResultDate()}</div> diff --git a/src/components/Action/ActionView.tsx b/src/components/Action/ActionView.tsx index 1b6a65dfa93f107ad5ffdc1f7b62407541974685..d3c06417185e99ea2a032f11b604828879dfc5ce 100644 --- a/src/components/Action/ActionView.tsx +++ b/src/components/Action/ActionView.tsx @@ -39,7 +39,7 @@ const ActionView: React.FC = () => { setHeaderHeight={defineHeaderHeight} desktopTitleKey={'common.title_action'} displayBackArrow={true} - ></Header> + /> <Content height={headerHeight}> {currentChallenge && renderAction(currentChallenge)} </Content> diff --git a/src/components/Analysis/AnalysisConsumption.spec.tsx b/src/components/Analysis/AnalysisConsumption.spec.tsx index 0366bc27ef838d4ec7b360eb9b6eac96f24bed24..4dfb6ac44d9d2b895956b28902f7a3664cab1862 100644 --- a/src/components/Analysis/AnalysisConsumption.spec.tsx +++ b/src/components/Analysis/AnalysisConsumption.spec.tsx @@ -54,7 +54,7 @@ jest.mock('services/profileTypeEntity.service', () => { }) jest.mock('components/Analysis/AnalysisConsumptionRow', () => () => ( - <div id="analysisconsumptionrow"></div> + <div id="analysisconsumptionrow" /> )) const mockStore = configureStore([]) diff --git a/src/components/Analysis/AnalysisView.tsx b/src/components/Analysis/AnalysisView.tsx index 5e427339814e260898b1689f616628e4e9236927..49f1099e26f860bd8afe3951f52768755bc5dabe 100644 --- a/src/components/Analysis/AnalysisView.tsx +++ b/src/components/Analysis/AnalysisView.tsx @@ -1,20 +1,20 @@ -import React, { useState, useEffect, useCallback } from 'react' -import { useSelector, useDispatch } from 'react-redux' -import { updateProfile } from 'store/profile/profile.actions' -import { toggleAnalysisNotification } from 'store/global/global.actions' +import React, { useCallback, useEffect, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' import { AppStore } from 'store' +import { toggleAnalysisNotification } from 'store/global/global.actions' +import { updateProfile } from 'store/profile/profile.actions' -import CozyBar from 'components/Header/CozyBar' -import Header from 'components/Header/Header' -import Content from 'components/Content/Content' import MonthlyAnalysis from 'components/Analysis/MonthlyAnalysis' -import './analysisView.scss' +import Content from 'components/Content/Content' import DateNavigator from 'components/DateNavigator/DateNavigator' +import CozyBar from 'components/Header/CozyBar' +import Header from 'components/Header/Header' +import { useClient } from 'cozy-client' +import { UsageEventType } from 'enum/usageEvent.enum' import { DateTime } from 'luxon' import { useLocation } from 'react-router-dom' import UsageEventService from 'services/usageEvent.service' -import { useClient } from 'cozy-client' -import { UsageEventType } from 'enum/usageEvent.enum' +import './analysisView.scss' const AnalysisView: React.FC = () => { const client = useClient() @@ -105,10 +105,10 @@ const AnalysisView: React.FC = () => { return ( <> - <CozyBar titleKey={'analysis.viewTitle'} /> + <CozyBar titleKey={'common.title_analysis'} /> <Header setHeaderHeight={defineHeaderHeight} - desktopTitleKey={'analysis.viewTitle'} + desktopTitleKey={'common.title_analysis'} > <DateNavigator currentAnalysisDate={currentAnalysisDate} diff --git a/src/components/Analysis/PieChart.tsx b/src/components/Analysis/PieChart.tsx index 72433597c1ac1d0b57513013a282eff56b5f1dde..65929a7cb42a84d8f2b46a5014cd93893f342c94 100644 --- a/src/components/Analysis/PieChart.tsx +++ b/src/components/Analysis/PieChart.tsx @@ -119,7 +119,7 @@ const PieChart: React.FC<PieProps> = ({ top: arcWidth / 2, left: arcWidth - arcWidth / 2, }} - ></div> + /> </div> <EstimatedConsumptionModal open={openEstimationModal} diff --git a/src/components/Challenge/ChallengeView.tsx b/src/components/Challenge/ChallengeView.tsx index 46ec435514b207fc75e8844036ac2c73c29fb563..7e3e1b74400fb374057a641308494c6ba64846c6 100644 --- a/src/components/Challenge/ChallengeView.tsx +++ b/src/components/Challenge/ChallengeView.tsx @@ -1,17 +1,17 @@ -import React, { useCallback, useEffect, useState } from 'react' -import './challengeView.scss' -import { useSelector } from 'react-redux' -import { AppStore } from 'store' -import CozyBar from 'components/Header/CozyBar' +import LeftArrowIcon from 'assets/icons/ico/left-arrow.svg' +import RightArrowIcon from 'assets/icons/ico/right-arrow.svg' +import StyledIconbutton from 'components/CommonKit/IconButton/StyledIconButton' import Content from 'components/Content/Content' +import CozyBar from 'components/Header/CozyBar' import Header from 'components/Header/Header' -import ChallengeCard from './ChallengeCard' -import StyledIconbutton from 'components/CommonKit/IconButton/StyledIconButton' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import LeftArrowIcon from 'assets/icons/ico/left-arrow.svg' -import RightArrowIcon from 'assets/icons/ico/right-arrow.svg' import { UserChallengeState } from 'enum/userChallenge.enum' import { UserChallenge } from 'models' +import React, { useCallback, useEffect, useState } from 'react' +import { useSelector } from 'react-redux' +import { AppStore } from 'store' +import ChallengeCard from './ChallengeCard' +import './challengeView.scss' const ChallengeView: React.FC = () => { const { t } = useI18n() @@ -147,7 +147,7 @@ const ChallengeView: React.FC = () => { <Header setHeaderHeight={defineHeaderHeight} desktopTitleKey={'common.title_challenge'} - ></Header> + /> <Content height={headerHeight}> <div className="challengeSlider" diff --git a/src/components/Charts/AxisBottom.tsx b/src/components/Charts/AxisBottom.tsx index 559f144fb839435a6670d5ae136a934fbaa0e419..9302b9cd943a9abe3184bc380c06914348b28b7e 100644 --- a/src/components/Charts/AxisBottom.tsx +++ b/src/components/Charts/AxisBottom.tsx @@ -171,7 +171,7 @@ const AxisBottom: React.FC<AxisBottomProps> = ({ x2={xScale.bandwidth() / 2} y1="0" y2={-(height - marginBottom)} - ></line> + /> ) : null} </g> ))} diff --git a/src/components/CommonKit/ErrorPage/ErrorPage.spec.tsx b/src/components/CommonKit/ErrorPage/ErrorPage.spec.tsx index fdc9f8093f7249ebba4cca314b06af13e510ecd4..abaea68bc68f3bc6cc2821c833a25d2e86fc1c63 100644 --- a/src/components/CommonKit/ErrorPage/ErrorPage.spec.tsx +++ b/src/components/CommonKit/ErrorPage/ErrorPage.spec.tsx @@ -25,8 +25,8 @@ jest.mock('react-router-dom', () => ({ }), })) -jest.mock('components/Header/Header', () => () => <div id="Header"></div>) -jest.mock('components/Header/CozyBar', () => () => <div id="CozyBar"></div>) +jest.mock('components/Header/Header', () => () => <div id="Header" />) +jest.mock('components/Header/CozyBar', () => () => <div id="CozyBar" />) // eslint-disable-next-line @typescript-eslint/no-explicit-any jest.mock('components/Content/Content', () => (props: any) => ( <div id="content">{props.children}</div> diff --git a/src/components/CommonKit/ErrorPage/ErrorPage.tsx b/src/components/CommonKit/ErrorPage/ErrorPage.tsx index 1a673d0111f983735179c7d291bbbd767b4ae189..58341fef52e2530efb389b64878749cc216bb1c1 100644 --- a/src/components/CommonKit/ErrorPage/ErrorPage.tsx +++ b/src/components/CommonKit/ErrorPage/ErrorPage.tsx @@ -1,12 +1,12 @@ -import React, { useCallback, useState } from 'react' +import { Button } from '@material-ui/core' +import BearIcon from 'assets/icons/visu/duelResult/CHALLENGE0001-0.svg' 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-dom' import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import React, { useCallback, useState } from 'react' +import { useHistory } from 'react-router-dom' import './errorPage.scss' interface ErrorPageProps { @@ -34,7 +34,7 @@ const ErrorPage: React.FC<ErrorPageProps> = ({ <Header setHeaderHeight={defineHeaderHeight} desktopTitleKey={'error_page.main'} - ></Header> + /> <Content height={headerHeight}> <div className="error-container"> <StyledIcon className="profile-icon" icon={BearIcon} size={250} /> diff --git a/src/components/Connection/FormLogin.tsx b/src/components/Connection/FormLogin.tsx index d1044446fe9591c002fc816a4d70033c69617333..cf25a9a3e620c40f79c09e1e41a8cba49d27c749 100644 --- a/src/components/Connection/FormLogin.tsx +++ b/src/components/Connection/FormLogin.tsx @@ -121,7 +121,7 @@ const FormLogin: React.FC<FormLoginProps> = ({ } value={login} inputMode="numeric" - ></input> + /> </div> <div className="form-group"> <input diff --git a/src/components/Connection/SGEConnect/SgeConnectView.tsx b/src/components/Connection/SGEConnect/SgeConnectView.tsx index 4097240cce25b7bd4b5893985a8af81018003a7e..d1e6d89d20e3af078f36ee46cadee431e20613e0 100644 --- a/src/components/Connection/SGEConnect/SgeConnectView.tsx +++ b/src/components/Connection/SGEConnect/SgeConnectView.tsx @@ -136,7 +136,7 @@ const SgeConnectView: React.FC = () => { setHeaderHeight={defineHeaderHeight} desktopTitleKey={'common.title_sge_connect'} displayBackArrow={true} - ></Header> + /> <Content height={headerHeight}> <div className="sge-view"> <div className="sge-container"> diff --git a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx index ec1fa6b954c4a7890d24e5c5ba00c5bcd03df3e1..fe02f644682aaaafa24fad8625051406f3c13871 100644 --- a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx +++ b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx @@ -31,7 +31,7 @@ const DataloadConsumptionVisualizer = ({ }, []) if (loading || !dataload) { - return <div className="dataloadvisualizer-root"></div> + return <div className="dataloadvisualizer-root" /> } if ( diff --git a/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx b/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx index 29e629a1b0a49e831c28d3ee2f72da2fba473400..b765c74730a02148aed03875c782c6299cde807c 100644 --- a/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx +++ b/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx @@ -63,7 +63,7 @@ const DataloadSectionDetail = ({ fluidType === FluidType.MULTIFLUID && dataloadSectionType !== DataloadSectionType.NO_COMPARE ) { - return <div className="dataloadvisualizer-euro text-16-normal"></div> + return <div className="dataloadvisualizer-euro text-16-normal" /> } if ( diff --git a/src/components/Duel/DuelView.tsx b/src/components/Duel/DuelView.tsx index 2e968b0189f8c1d094d8a3bae7fd4156003bfcf9..54edb152bc533b29ab2c8ae014d08bb481b46b73 100644 --- a/src/components/Duel/DuelView.tsx +++ b/src/components/Duel/DuelView.tsx @@ -57,7 +57,7 @@ const DuelView: React.FC = () => { setHeaderHeight={defineHeaderHeight} desktopTitleKey={'common.title_duel'} displayBackArrow={true} - ></Header> + /> <Content height={headerHeight}> <div> {challengeToDisplay && diff --git a/src/components/Ecogesture/EcogestureCard.spec.tsx b/src/components/Ecogesture/EcogestureCard.spec.tsx index 3146ddbdb375ff02e25230b93ed77e1859ba5775..2aca94f0f5a5ffff3ac0c7749837d1a6dcfddfab 100644 --- a/src/components/Ecogesture/EcogestureCard.spec.tsx +++ b/src/components/Ecogesture/EcogestureCard.spec.tsx @@ -20,7 +20,7 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { } }) jest.mock('components/CommonKit/Icon/StyledIcon', () => () => ( - <div id="StyledIcon"></div> + <div id="StyledIcon" /> )) const mockImportIconbyId = jest.fn() jest.mock('utils/utils', () => { diff --git a/src/components/Ecogesture/SingleEcogesture.spec.tsx b/src/components/Ecogesture/SingleEcogesture.spec.tsx index 1c4cd286b5237908c5364e48b51c8a57b47c7498..bf710ac4a42484808a829c3ccacd8a215b4e4878 100644 --- a/src/components/Ecogesture/SingleEcogesture.spec.tsx +++ b/src/components/Ecogesture/SingleEcogesture.spec.tsx @@ -27,11 +27,11 @@ jest.mock('utils/utils', () => { }) jest.mock('components/Ecogesture/EfficientyRating', () => () => ( - <div id="EfficientyRating"></div> + <div id="EfficientyRating" /> )) -jest.mock('components/Header/Header', () => () => <div id="Header"></div>) -jest.mock('components/Header/CozyBar', () => () => <div id="CozyBar"></div>) -jest.mock('components/Loader/Loader', () => () => <div id="spinner"></div>) +jest.mock('components/Header/Header', () => () => <div id="Header" />) +jest.mock('components/Header/CozyBar', () => () => <div id="CozyBar" />) +jest.mock('components/Loader/Loader', () => () => <div id="spinner" />) // eslint-disable-next-line @typescript-eslint/no-explicit-any jest.mock('components/Content/Content', () => (props: any) => ( <div id="content">{props.children}</div> diff --git a/src/components/Ecogesture/SingleEcogesture.tsx b/src/components/Ecogesture/SingleEcogesture.tsx index 2d49b1c0d8eb4314afad4ccecd907e33b907475d..a84c41f078c18b82f9b5ad3b5aa989b48c7bd471 100644 --- a/src/components/Ecogesture/SingleEcogesture.tsx +++ b/src/components/Ecogesture/SingleEcogesture.tsx @@ -141,17 +141,15 @@ const SingleEcogesture: React.FC<SingleEcogestureProps> = ({ return ecogesture ? ( <> <CozyBar - titleKey={t('common.title_ecogesture')} - isNotKey={true} + titleKey={'common.title_ecogesture'} displayBackArrow={true} backFunction={() => history.push('/ecogestures')} /> <Header setHeaderHeight={defineHeaderHeight} - desktopTitleKey={t('common.title_ecogesture')} + desktopTitleKey={'common.title_ecogesture'} displayBackArrow={true} - isNotKey={true} - ></Header> + /> <Content height={headerHeight}> <div className="single-ecogesture"> <div className="icon-container"> diff --git a/src/components/Ecogesture/__snapshots__/SingleEcogesture.spec.tsx.snap b/src/components/Ecogesture/__snapshots__/SingleEcogesture.spec.tsx.snap index 23aaff6f392f44a743614f35dc94f361e2ac6136..aa643f350403b2285e38d710bf3bf9a2b1989a72 100644 --- a/src/components/Ecogesture/__snapshots__/SingleEcogesture.spec.tsx.snap +++ b/src/components/Ecogesture/__snapshots__/SingleEcogesture.spec.tsx.snap @@ -25,7 +25,6 @@ exports[`SingleEcogesture component should be rendered correctly 1`] = ` <Component backFunction={[Function]} displayBackArrow={true} - isNotKey={true} titleKey="common.title_ecogesture" > <div @@ -35,7 +34,6 @@ exports[`SingleEcogesture component should be rendered correctly 1`] = ` <Component desktopTitleKey="common.title_ecogesture" displayBackArrow={true} - isNotKey={true} setHeaderHeight={[Function]} > <div diff --git a/src/components/EcogestureForm/EcogestureFormView.tsx b/src/components/EcogestureForm/EcogestureFormView.tsx index 2e001b9fc2127c95c2b60a7dd8b8fda4ec4fd2f8..d160707331f9c22eb085550666be60d71926c0a4 100644 --- a/src/components/EcogestureForm/EcogestureFormView.tsx +++ b/src/components/EcogestureForm/EcogestureFormView.tsx @@ -102,7 +102,7 @@ const EcogestureFormView: React.FC = () => { <Header setHeaderHeight={defineHeaderHeight} desktopTitleKey={'common.title_ecogestures'} - ></Header> + /> <Content height={headerHeight}> {isProfileTypeCompleted ? ( <ProfileTypeView /> diff --git a/src/components/EcogestureSelection/EcogestureSelection.tsx b/src/components/EcogestureSelection/EcogestureSelection.tsx index 1dd8fb2d7723aa408fd5c8e04bb628e1f9abb811..e65190a65efbd2c2a614be892fb7e82adcaf4407 100644 --- a/src/components/EcogestureSelection/EcogestureSelection.tsx +++ b/src/components/EcogestureSelection/EcogestureSelection.tsx @@ -125,16 +125,14 @@ const EcogestureSelection: React.FC = () => { return ( <> <CozyBar - titleKey={t('common.title_ecogestures_choice')} - isNotKey={true} + titleKey={'common.title_ecogestures_choice'} displayBackArrow={true} backFunction={() => history.push('/ecogestures')} /> <Header setHeaderHeight={defineHeaderHeight} - desktopTitleKey={t('common.title_ecogestures_choice')} + desktopTitleKey={'common.title_ecogestures_choice'} displayBackArrow={true} - isNotKey={true} > <div className="eg-selection-header"> {indexEcogesture <= ecogestureList.length - 1 diff --git a/src/components/EcogestureSelection/__snapshots__/EcogestureSelection.spec.tsx.snap b/src/components/EcogestureSelection/__snapshots__/EcogestureSelection.spec.tsx.snap index 5680d8025e4e8999108f259e115c2fe00035c465..32838b95b199f5c6354c5fb61b4dd2e60415240c 100644 --- a/src/components/EcogestureSelection/__snapshots__/EcogestureSelection.spec.tsx.snap +++ b/src/components/EcogestureSelection/__snapshots__/EcogestureSelection.spec.tsx.snap @@ -17,13 +17,11 @@ exports[`EcogestureSelection component should be rendered correctly 1`] = ` <mock-cozybar backFunction={[Function]} displayBackArrow={true} - isNotKey={true} titleKey="common.title_ecogestures_choice" /> <mock-header desktopTitleKey="common.title_ecogestures_choice" displayBackArrow={true} - isNotKey={true} setHeaderHeight={[Function]} > <div diff --git a/src/components/Exploration/ExplorationView.tsx b/src/components/Exploration/ExplorationView.tsx index 587bc84f567978764b82d5498188209461d486c9..34b39786e36aeb7aa18c4b2246f108cfa892b889 100644 --- a/src/components/Exploration/ExplorationView.tsx +++ b/src/components/Exploration/ExplorationView.tsx @@ -40,7 +40,7 @@ const ExplorationView: React.FC = () => { setHeaderHeight={defineHeaderHeight} desktopTitleKey={'common.title_exploration'} displayBackArrow={true} - ></Header> + /> <Content height={headerHeight}> {currentChallenge && renderExploration(currentChallenge)} </Content> diff --git a/src/components/FormGlobal/FormProgress.tsx b/src/components/FormGlobal/FormProgress.tsx index 8f8616872dbadd4abe525f2482831a8fa9c82ff4..b371ef2ae9562de3cda95a956ee90b9bc1fcfcae 100644 --- a/src/components/FormGlobal/FormProgress.tsx +++ b/src/components/FormGlobal/FormProgress.tsx @@ -26,7 +26,7 @@ const FormProgress: React.FC<FormProgressProps> = ({ <div className={'profile-type-progress-bar-content'} style={{ width: `${getProgress()}%` }} - ></div> + /> </div> </div> ) diff --git a/src/components/GCU/GCUView.tsx b/src/components/GCU/GCUView.tsx index 775fc21005a4d157227ef51462a009805fa5a114..841c4832243bbc5836ba57800051df27e70a8229 100644 --- a/src/components/GCU/GCUView.tsx +++ b/src/components/GCU/GCUView.tsx @@ -1,8 +1,8 @@ -import React, { useCallback, useState } from 'react' -import CozyBar from 'components/Header/CozyBar' -import Header from 'components/Header/Header' import Content from 'components/Content/Content' import GCUContent from 'components/GCU/GCUContent' +import CozyBar from 'components/Header/CozyBar' +import Header from 'components/Header/Header' +import React, { useCallback, useState } from 'react' const GCUView: React.FC = () => { const [headerHeight, setHeaderHeight] = useState<number>(0) @@ -18,7 +18,7 @@ const GCUView: React.FC = () => { setHeaderHeight={defineHeaderHeight} desktopTitleKey={'common.title_gcu'} displayBackArrow={true} - ></Header> + /> <Content height={headerHeight}> <GCUContent /> </Content> diff --git a/src/components/Header/CozyBar.tsx b/src/components/Header/CozyBar.tsx index 33b4c8d7449ba701836f955187b1e62bf12d8a02..e551519bf541cb61d4a8ab7215f0e9fcb808d40a 100644 --- a/src/components/Header/CozyBar.tsx +++ b/src/components/Header/CozyBar.tsx @@ -12,14 +12,13 @@ import { updateModalIsFeedbacksOpen } from 'store/modal/modal.actions' interface CozyBarProps { titleKey?: string displayBackArrow?: boolean - isNotKey?: boolean backFunction?: () => void } +/** Header with CozyBar for mobile view */ const CozyBar = ({ titleKey = 'common.title_app', displayBackArrow = false, - isNotKey, backFunction, }: CozyBarProps) => { const { t } = useI18n() @@ -43,7 +42,7 @@ const CozyBar = ({ const cozyBarCustom = (screen?: ScreenType) => { if (screen === ScreenType.MOBILE) { return ( - <React.Fragment> + <> {displayBackArrow && ( <BarLeft> <StyledIconButton @@ -56,9 +55,7 @@ const CozyBar = ({ )} <BarCenter> <div className="cozy-bar"> - <span className="app-title"> - {isNotKey ? titleKey : t(titleKey)} - </span> + <span className="app-title">{t(titleKey)}</span> </div> </BarCenter> <BarRight> @@ -70,7 +67,7 @@ const CozyBar = ({ onClick={handleClickFeedbacks} /> </BarRight> - </React.Fragment> + </> ) } return null diff --git a/src/components/Header/Header.spec.tsx b/src/components/Header/Header.spec.tsx index 3aab69e60e9d74357fee306a45a6702effc59c42..272c79896a49af0861773baa0e0244beecdb1fc5 100644 --- a/src/components/Header/Header.spec.tsx +++ b/src/components/Header/Header.spec.tsx @@ -1,14 +1,13 @@ -import React from 'react' +import IconButton from '@material-ui/core/IconButton' +import Header from 'components/Header/Header' +import { ScreenType } from 'enum/screen.enum' import { mount } from 'enzyme' +import React from 'react' import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' import * as ModalAction from 'store/modal/modal.actions' -import Header from 'components/Header/Header' import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' -import { ScreenType } from 'enum/screen.enum' -import IconButton from '@material-ui/core/IconButton' - jest.mock('cozy-ui/transpiled/react/I18n', () => { return { useI18n: jest.fn(() => { @@ -38,26 +37,15 @@ describe('Header component', () => { }) const wrapper = mount( <Provider store={store}> - <Header setHeaderHeight={mocksetHeaderHeight} /> + <Header + setHeaderHeight={mocksetHeaderHeight} + desktopTitleKey="mockKey" + /> </Provider> ) expect(wrapper.find('.header')).toHaveLength(1) }) - it('should display text when textKey is provided', () => { - const store = mockStore({ - ecolyo: { - global: globalStateData, - }, - }) - const wrapper = mount( - <Provider store={store}> - <Header textKey={'KEY'} setHeaderHeight={mocksetHeaderHeight} /> - </Provider> - ) - expect(wrapper.find('.header-text').first().text()).toEqual('KEY') - }) - it('should display title and back button when desktopTitle key provided and displayBackArrow is true', () => { const store = mockStore({ ecolyo: { @@ -113,7 +101,10 @@ describe('Header component', () => { }) const wrapper = mount( <Provider store={store}> - <Header setHeaderHeight={mocksetHeaderHeight} /> + <Header + setHeaderHeight={mocksetHeaderHeight} + desktopTitleKey="mockKey" + /> </Provider> ) const updateModalSpy = jest.spyOn(ModalAction, 'updateModalIsFeedbacksOpen') diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 3a469698acd1c2763813fac605baae53afe10cfe..8ff67e6ba539b1bf758a40248aa3a6afe2b0b943 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -1,36 +1,33 @@ -import React, { useCallback, useEffect, useRef } from 'react' -import './header.scss' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { useSelector, useDispatch } from 'react-redux' -import { AppStore } from 'store' -import { updateModalIsFeedbacksOpen } from 'store/modal/modal.actions' -import { useHistory } from 'react-router-dom' - -import { ScreenType } from 'enum/screen.enum' +import IconButton from '@material-ui/core/IconButton' import BackArrowIcon from 'assets/icons/ico/back-arrow.svg' import FeedbackIcon from 'assets/icons/ico/feedback.svg' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Icon from 'cozy-ui/transpiled/react/Icon' -import IconButton from '@material-ui/core/IconButton' +import { ScreenType } from 'enum/screen.enum' +import React, { useCallback, useEffect, useRef } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { useHistory } from 'react-router-dom' +import { AppStore } from 'store' +import { updateModalIsFeedbacksOpen } from 'store/modal/modal.actions' +import './header.scss' interface HeaderProps { - textKey?: string - desktopTitleKey?: string + /** translation key used as t('key.value') */ + desktopTitleKey: string displayBackArrow?: boolean children?: React.ReactNode setHeaderHeight(height: number): void - isNotKey?: boolean backFunction?: () => void } +/** Header for desktop view */ const Header: React.FC<HeaderProps> = ({ - textKey, desktopTitleKey, displayBackArrow, children, setHeaderHeight, - isNotKey, backFunction, -}: HeaderProps) => { +}) => { const { t } = useI18n() const history = useHistory() const header = useRef(null) @@ -67,22 +64,11 @@ const Header: React.FC<HeaderProps> = ({ <div className="header-content"> <div className={ - !textKey && !desktopTitleKey + !desktopTitleKey ? 'header-content-top header-content-top-right' : 'header-content-top' } > - {textKey && ( - <div - className={`header-text ${ - screenType === ScreenType.MOBILE - ? 'text-14-normal-uppercase' - : 'text-22-bold' - }`} - > - {isNotKey ? textKey : t(textKey)} - </div> - )} {desktopTitleKey && ( <div className={`header-text-desktop ${ @@ -100,13 +86,13 @@ const Header: React.FC<HeaderProps> = ({ <Icon icon={BackArrowIcon} size={16} /> </IconButton> )} - <span>{isNotKey ? desktopTitleKey : t(desktopTitleKey)}</span> + <span>{t(desktopTitleKey)}</span> </div> )} <IconButton aria-label={t('header.accessibility.button_open_feedbacks')} className={ - !textKey && !desktopTitleKey + !desktopTitleKey ? 'header-feedbacks-button right' : 'header-feedbacks-button' } @@ -118,7 +104,7 @@ const Header: React.FC<HeaderProps> = ({ {children} </div> </div> - <div className="header-bar"></div> + <div className="header-bar" /> </div> ) } diff --git a/src/components/Header/header.scss b/src/components/Header/header.scss index 58b400875df97adae6f402c919734b5db7e52a09..755efde668cf828c91db1a5f96cfc3e8ae0eeb7f 100644 --- a/src/components/Header/header.scss +++ b/src/components/Header/header.scss @@ -7,11 +7,15 @@ align-items: center; flex-direction: column; overflow: hidden; - width: 100%; + width: 85%; z-index: $z-header; position: fixed; top: 48px; - left: 0; + + @media #{$tablet} { + width: 100%; + } + @media #{$large-phone} { top: 0; } @@ -28,7 +32,6 @@ } } .header-content { - margin: 0 0 0 220px; display: flex; flex-direction: column; @media #{$tablet} { diff --git a/src/components/Home/ConsumptionView.tsx b/src/components/Home/ConsumptionView.tsx index c16b6ce740a524f091fd55dd4262b36371344efb..71426c536e45a82f4671113548cade25964f5a3c 100644 --- a/src/components/Home/ConsumptionView.tsx +++ b/src/components/Home/ConsumptionView.tsx @@ -177,8 +177,11 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ return ( <> - <CozyBar titleKey={'navigation.consumption'} /> - <Header setHeaderHeight={defineHeaderHeight}> + <CozyBar titleKey={'common.title_consumption'} /> + <Header + setHeaderHeight={defineHeaderHeight} + desktopTitleKey={'common.title_consumption'} + > <DateNavigator /> </Header> <Content height={headerHeight}> @@ -188,7 +191,7 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ <ReleaseNotesModal open={openReleaseNoteModal} handleCloseClick={handleCloseReleaseNoteModal} - ></ReleaseNotesModal> + /> )} {isFluidKonnected ? ( <> diff --git a/src/components/LegalNotice/LegalNoticeView.tsx b/src/components/LegalNotice/LegalNoticeView.tsx index f4c83a0e45cf3f6397a0017801950f5e47fa9294..6f66c937f972ec37b0bb96b4ae15bd32b75150f6 100644 --- a/src/components/LegalNotice/LegalNoticeView.tsx +++ b/src/components/LegalNotice/LegalNoticeView.tsx @@ -1,9 +1,9 @@ -import React, { useCallback, useState } from 'react' +import Content from 'components/Content/Content' import CozyBar from 'components/Header/CozyBar' import Header from 'components/Header/Header' -import Content from 'components/Content/Content' -import './legalNoticeView.scss' +import React, { useCallback, useState } from 'react' import LegalNoticeContent from './LegalNoticeContent' +import './legalNoticeView.scss' const LegalNoticeView: React.FC = () => { const [headerHeight, setHeaderHeight] = useState<number>(0) @@ -18,7 +18,7 @@ const LegalNoticeView: React.FC = () => { setHeaderHeight={defineHeaderHeight} desktopTitleKey={'common.title_legal_notice'} displayBackArrow={true} - ></Header> + /> <Content height={headerHeight}> <LegalNoticeContent /> </Content> diff --git a/src/components/Options/MatomoOptOut/MatomoOptOut.tsx b/src/components/Options/MatomoOptOut/MatomoOptOut.tsx index c638d3edaaf568b11361e9e1fbd4e82c7cdbe957..127642014faec613eb8798cc55e6be0803848fbc 100644 --- a/src/components/Options/MatomoOptOut/MatomoOptOut.tsx +++ b/src/components/Options/MatomoOptOut/MatomoOptOut.tsx @@ -17,7 +17,7 @@ const MatomoOptOut: React.FC = () => { <iframe style={{ height: '250px' }} src={`${baseUrl}index.php?module=CoreAdminHome&action=optOut&language=fr&backgroundColor=121212&fontColor=e0e0e0&fontSize=&fontFamily=sans-serif`} - ></iframe> + /> </div> </div> ) diff --git a/src/components/Options/OptionsView.tsx b/src/components/Options/OptionsView.tsx index 15fd3108a7219bb5ab44763929dddabb46615a83..ed07406fddecb8a5d824206ac99975b8fa7bdffe 100644 --- a/src/components/Options/OptionsView.tsx +++ b/src/components/Options/OptionsView.tsx @@ -24,7 +24,7 @@ const OptionsView: React.FC = () => { <Header setHeaderHeight={defineHeaderHeight} desktopTitleKey={'common.title_options'} - ></Header> + /> <Content height={headerHeight}> <ProfileTypeOptions /> <ExportOptions /> diff --git a/src/components/Options/Unsubscribe/UnSubscribe.tsx b/src/components/Options/Unsubscribe/UnSubscribe.tsx index bbf9646baf05915bfaba3d95a9728c827948d452..6253a5ccd5d72ad2e6b8285074eea164d6ca0d3d 100644 --- a/src/components/Options/Unsubscribe/UnSubscribe.tsx +++ b/src/components/Options/Unsubscribe/UnSubscribe.tsx @@ -1,15 +1,15 @@ -import React, { useState } from 'react' -import './unSubscribe.scss' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { Button } from '@material-ui/core' +import BearIcon from 'assets/icons/visu/duelResult/CHALLENGE0001-0.svg' +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 StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import BearIcon from 'assets/icons/visu/duelResult/CHALLENGE0001-0.svg' -import { Button } from '@material-ui/core' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import React, { useState } from 'react' import { useDispatch } from 'react-redux' -import { updateProfile } from 'store/profile/profile.actions' import { useHistory } from 'react-router-dom' +import { updateProfile } from 'store/profile/profile.actions' +import './unSubscribe.scss' const UnSubscribe: React.FC = () => { const [headerHeight, setHeaderHeight] = useState<number>(0) @@ -30,7 +30,7 @@ const UnSubscribe: React.FC = () => { <Header setHeaderHeight={defineHeaderHeight} desktopTitleKey={'common.title_analysis'} - ></Header> + /> <Content height={headerHeight}> <div className="unsubscribe-container"> <StyledIcon className="profile-icon" icon={BearIcon} size={250} /> diff --git a/src/components/ProfileType/ProfileTypeView.tsx b/src/components/ProfileType/ProfileTypeView.tsx index 49de9edb4eb2b6fcf59393070300cb5d8a53f9c8..88d58c2300888537e741dcf5dec2d40b8d5d4fee 100644 --- a/src/components/ProfileType/ProfileTypeView.tsx +++ b/src/components/ProfileType/ProfileTypeView.tsx @@ -1,12 +1,16 @@ -import React, { useCallback, useEffect, useState } from 'react' -import 'components/ProfileType/profileTypeView.scss' +import Content from 'components/Content/Content' import CozyBar from 'components/Header/CozyBar' import Header from 'components/Header/Header' -import Content from 'components/Content/Content' -import ProfileTypeFormSingleChoice from 'components/ProfileType/ProfileTypeFormSingleChoice' import ProfileTypeFinished from 'components/ProfileType/ProfileTypeFinished' +import ProfileTypeFormSingleChoice from 'components/ProfileType/ProfileTypeFormSingleChoice' +import 'components/ProfileType/profileTypeView.scss' +import React, { useCallback, useEffect, useState } from 'react' -import { ProfileType, ProfileTypeAnswer } from 'models/profileType.model' +import EcogestureFormEquipment from 'components/EcogestureForm/EcogestureFormEquipment' +import ProfileTypeFormMultiChoice from 'components/ProfileType/ProfileTypeFormMultiChoice' +import ProfileTypeFormNumber from 'components/ProfileType/ProfileTypeFormNumber' +import ProfileTypeFormNumberSelection from 'components/ProfileType/ProfileTypeFormNumberSelection' +import { FluidType } from 'enum/fluid.enum' import { ConstructionYear, Floor, @@ -20,17 +24,13 @@ import { ThreeChoicesAnswer, WarmingType, } from 'enum/profileType.enum' -import { FluidType } from 'enum/fluid.enum' -import ProfileTypeFormMultiChoice from 'components/ProfileType/ProfileTypeFormMultiChoice' -import ProfileTypeFormNumber from 'components/ProfileType/ProfileTypeFormNumber' -import ProfileTypeFormNumberSelection from 'components/ProfileType/ProfileTypeFormNumberSelection' -import { useSelector } from 'react-redux' -import { AppStore } from 'store' import { DateTime } from 'luxon' +import { ProfileEcogesture } from 'models/profileEcogesture.model' +import { ProfileType, ProfileTypeAnswer } from 'models/profileType.model' +import { useSelector } from 'react-redux' import ProfileTypeFormService from 'services/profileTypeForm.service' +import { AppStore } from 'store' import ProfileTypeFormDateSelection from './ProfileTypeFormDateSelection' -import EcogestureFormEquipment from 'components/EcogestureForm/EcogestureFormEquipment' -import { ProfileEcogesture } from 'models/profileEcogesture.model' const ProfileTypeView: React.FC = () => { const profile = useSelector((state: AppStore) => state.ecolyo.profile) @@ -219,7 +219,7 @@ const ProfileTypeView: React.FC = () => { setHeaderHeight={defineHeaderHeight} desktopTitleKey={'common.title_profiletype'} displayBackArrow={true} - ></Header> + /> <Content height={headerHeight}> <div className={'profile-type-container'}> {isLoading ? null : step !== ProfileTypeStepForm.END ? ( diff --git a/src/components/Quiz/QuizQuestion.spec.tsx b/src/components/Quiz/QuizQuestion.spec.tsx index 240eefd26fa0dfb0c99634056c194037aac92890..c18c3e175b34403e9863d9df17632dc0677942e5 100644 --- a/src/components/Quiz/QuizQuestion.spec.tsx +++ b/src/components/Quiz/QuizQuestion.spec.tsx @@ -39,10 +39,10 @@ jest.mock('services/quiz.service', () => { }) jest.mock('components/Quiz/QuizCustomQuestionContent', () => () => ( - <div id="quizcustomquestioncontent"></div> + <div id="quizcustomquestioncontent" /> )) jest.mock('components/Quiz/QuizQuestionContent', () => () => ( - <div id="quizquestioncontent"></div> + <div id="quizquestioncontent" /> )) const useSelectorSpy = jest.spyOn(reactRedux, 'useSelector') diff --git a/src/components/Quiz/QuizView.tsx b/src/components/Quiz/QuizView.tsx index 6951043855f7e599cb80cf7b873b13d0019108b9..71388bcb52ad7636ecb3c6abc5495f0796aa87ff 100644 --- a/src/components/Quiz/QuizView.tsx +++ b/src/components/Quiz/QuizView.tsx @@ -40,7 +40,7 @@ const QuizView: React.FC = () => { setHeaderHeight={defineHeaderHeight} desktopTitleKey={'common.title_quiz'} displayBackArrow={true} - ></Header> + /> <Content height={headerHeight}> {currentChallenge && renderQuiz(currentChallenge)} </Content> diff --git a/src/components/Splash/SplashScreen.tsx b/src/components/Splash/SplashScreen.tsx index 53c526a4eeb671f210f8ed62ec53a7f393b6059b..7b8eabf85674bc4a7e93b2658c23f1b1f6c2604b 100644 --- a/src/components/Splash/SplashScreen.tsx +++ b/src/components/Splash/SplashScreen.tsx @@ -29,7 +29,7 @@ const SplashScreen: React.FC<SplashScreenProps> = ({ <div className="splash-progress-bar-content" style={{ width: `${getProgress()}%` }} - ></div> + /> </div> </div> </div> diff --git a/src/components/TimeStepSelector/TimeStepSelector.tsx b/src/components/TimeStepSelector/TimeStepSelector.tsx index 75e9b9ef5d97f8cde7d3b42e51f33c0d0297e5e7..62017f27e2c46c75bee2abcc64d42cf38768169d 100644 --- a/src/components/TimeStepSelector/TimeStepSelector.tsx +++ b/src/components/TimeStepSelector/TimeStepSelector.tsx @@ -105,12 +105,12 @@ const TimeStepSelector: React.FC<TimeStepSelectorProps> = ({ onClick={() => handleChangeTimeStep(step)} id={TimeStep[step].toLowerCase()} > - <span className="clickable-area"></span> + <span className="clickable-area" /> <span className={'text text-14-normal'}> {t(`timestep.${TimeStep[step].toLowerCase()}.period`)} </span> </li> - <li className="bar"></li> + <li className="bar" /> </React.Fragment> ) })} diff --git a/src/locales/fr.json b/src/locales/fr.json index 736307b547aceaba765e53ebc63eac8aa189037b..112c7f1a2e1b202660868d6e8924fb7377bc7cf0 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -1,6 +1,7 @@ { "common": { "title_app": "Ecolyo", + "title_consumption": "Conso", "title_challenge": "Défis", "title_quiz": "Quiz", "title_exploration": "Exploration", @@ -19,6 +20,13 @@ "loading": "Chargement" } }, + "navigation": { + "consumption": "Conso", + "challenges": "Défis", + "ecogestures": "Astuces", + "options": "Options", + "analysis": "Analyse" + }, "FLUID": { "ELECTRICITY": { "NAME": "Électricité", @@ -885,13 +893,6 @@ "button_close": "Fermer la fenêtre" } }, - "navigation": { - "consumption": "Conso", - "challenges": "Défis", - "ecogestures": "Astuces", - "options": "Options", - "analysis": "Analyse" - }, "oauth": { "window": { "title": "OAuth" diff --git a/src/styles/base/_layout.scss b/src/styles/base/_layout.scss index 977aa5666dd3e1b703ae9ea0b95e787f1fdb0988..63369debd4a3f418c3b063be15c330ce58711b52 100644 --- a/src/styles/base/_layout.scss +++ b/src/styles/base/_layout.scss @@ -45,76 +45,6 @@ body { color: #32363f; } -.header { - display: flex; - align-items: center; - flex-direction: column; - overflow: hidden; - width: 100%; - z-index: $z-header; - position: fixed; - top: 48px; - left: 0; - @media #{$large-phone} { - top: 0; - } - .header-top { - background: radial-gradient( - circle, - rgba(52, 54, 65, 1) 0%, - rgba(27, 28, 34, 1) 100% - ); - width: 100%; - .header-text { - padding: 0 1rem 1rem 1rem; - color: $grey-bright; - } - } - .header-content { - margin: 0 0 0 220px; - display: flex; - flex-direction: column; - @media #{$tablet} { - margin: 0; - } - @media #{$large-phone} { - margin: 60px 0 0 0; - } - .header-content-top { - display: flex; - flex-direction: row; - &.header-content-top-right { - justify-content: flex-end; - } - .header-text { - padding: 2rem 1rem; - flex: 1; - } - .header-text-desktop { - display: flex; - flex: 1; - padding: 2rem 1.25rem; - color: $grey-bright; - } - .header-back-button { - padding: 0 0.75rem; - } - @media #{$large-phone} { - .header-text { - padding: 0 1rem 1rem 1rem; - color: $grey-bright; - } - .header-text-desktop { - display: none; - } - .header-feedbacks-button { - display: none; - } - } - } - } -} - .content-view-loading { height: 80vh; width: 100%;