diff --git a/docker/cozy-app-dev-with-app.sh b/docker/cozy-app-dev-with-app.sh index e53fc8881b7018f837bf9de7c815b75298fe17d8..45571eb6b3c450fb6ed9499f7e581cc19c447c90 100755 --- a/docker/cozy-app-dev-with-app.sh +++ b/docker/cozy-app-dev-with-app.sh @@ -211,9 +211,13 @@ do_install_app() { echo "App succesfully installed" echo "Installing konnectors" - if cozy-stack konnectors ls | grep 'enedisgrandlyon'; then - echo "Removing konnector enedisgrandlyon..." - cozy-stack konnectors uninstall --domain cozy.tools:8080 enedisgrandlyon + # if cozy-stack konnectors ls | grep 'enedisgrandlyon'; then + # echo "Removing konnector enedisgrandlyon..." + # cozy-stack konnectors uninstall --domain cozy.tools:8080 enedisgrandlyon + # fi + if cozy-stack konnectors ls | grep 'enedis-sge-grandlyon'; then + echo "Removing konnector enedis-sge-grandlyon..." + cozy-stack konnectors uninstall --domain cozy.tools:8080 enedis-sge-grandlyon fi if cozy-stack konnectors ls | grep 'grdfgrandlyon'; then echo "Removing konnector grdfgrandlyon..." @@ -223,7 +227,8 @@ do_install_app() { echo "Removing konnector eglgrandlyon..." cozy-stack konnectors uninstall --domain cozy.tools:8080 eglgrandlyon fi - cozy-stack konnectors install --domain cozy.tools:8080 enedisgrandlyon git://forge.grandlyon.com/web-et-numerique/llle_project/enedis-konnector.git#build + # cozy-stack konnectors install --domain cozy.tools:8080 enedisgrandlyon git://forge.grandlyon.com/web-et-numerique/llle_project/enedis-konnector.git#build + cozy-stack konnectors install --domain cozy.tools:8080 enedis-sge-grandlyon git://forge.grandlyon.com/web-et-numerique/llle_project/enedis-sge-konnector.git#build cozy-stack konnectors install --domain cozy.tools:8080 grdfgrandlyon git://forge.grandlyon.com/web-et-numerique/llle_project/grdf-konnector.git#build cozy-stack konnectors install --domain cozy.tools:8080 eglgrandlyon git://forge.grandlyon.com/web-et-numerique/llle_project/egl-konnector.git#build } diff --git a/docker/cozy.yaml b/docker/cozy.yaml index 525c2f3142f3f876108665b2286b42c04ba0a977..93fc6acde705ae6e934ecb9420b005877d9394bc 100644 --- a/docker/cozy.yaml +++ b/docker/cozy.yaml @@ -4,5 +4,8 @@ # You will ALWAYS have CSPs working on a real Cozy # so your final application must work with them on disable_csp: true +log: + # logger level (debug, info, warning, panic, fatal) - flags: --log-level + level: debug # You can find a complete example of the cozy-stack config file here: # https://github.com/cozy/cozy-stack/blob/master/cozy.example.yaml diff --git a/scripts/createConnections.js b/scripts/createConnections.js index ab05e05b460318901ea5bdfbcc80ec71749b65c3..55f85da6d37b21ae8de85adadb2d87e512d97de7 100644 --- a/scripts/createConnections.js +++ b/scripts/createConnections.js @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -/* eslint-disable @typescript-eslint/camelcase */ const axios = require('axios') const config = require('./config') diff --git a/src/assets/icons/visu/pdl-image.svg b/src/assets/icons/visu/pdl-image.svg new file mode 100644 index 0000000000000000000000000000000000000000..67f4644f55ec57e425c295a0f6dba654f32cda3c --- /dev/null +++ b/src/assets/icons/visu/pdl-image.svg @@ -0,0 +1,9 @@ +<svg width="237" height="385" viewBox="0 0 237 385" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<rect width="237" height="385" fill="url(#pattern0)"/> +<defs> +<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1"> +<use xlink:href="#image0_12639_80631" transform="translate(-0.000276683) scale(0.00380439 0.00234192)"/> +</pattern> +<image id="image0_12639_80631" width="263" height="427" xlink:href="data:image/png;base64,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"/> +</defs> +</svg> diff --git a/src/components/App.tsx b/src/components/App.tsx index 2877180faca003b9ef1c3cd4f465b6c49fbc3e9e..a4b354b0a8198b8e88cb157c9341022a021e6390 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -50,10 +50,7 @@ export const App = ({ tracker }: AppProps) => { )} <Main> <Content className="app-content"> - <Routes - termsStatus={termsStatus} - isProfileEcogestureCompleted={isProfileEcogestureCompleted} - /> + <Routes termsStatus={termsStatus} /> </Content> </Main> </SplashRoot> diff --git a/src/components/Connection/Connection.spec.tsx b/src/components/Connection/Connection.spec.tsx index bc417a77f2df40182fefa5590f26754f053cd15c..e3f3dca8bbc8091b8313f0d1d2b16a099094fc6b 100644 --- a/src/components/Connection/Connection.spec.tsx +++ b/src/components/Connection/Connection.spec.tsx @@ -3,6 +3,10 @@ import { mount } from 'enzyme' import toJson from 'enzyme-to-json' import Connection from 'components/Connection/Connection' import { fluidStatusConnectedData } from '../../../tests/__mocks__/fluidStatusData.mock' +import * as reactRedux from 'react-redux' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' jest.mock('components/Connection/ConnectionLogin', () => { return jest.fn(() => { @@ -25,23 +29,31 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) - -const mockDispatch = jest.fn() -jest.mock('react-redux', () => ({ - useDispatch: () => mockDispatch, -})) - +const mockStore = configureStore([]) +const useDispatchSpy = jest.spyOn(reactRedux, 'useDispatch') +const useSelectorSpy = jest.spyOn(reactRedux, 'useSelector') describe('Connection component test', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) it('should call ConnectionOAuth', () => { const wrapper = mount( - <Connection fluidStatus={fluidStatusConnectedData[2]} /> + <Provider store={store}> + <Connection fluidStatus={fluidStatusConnectedData[2]} /> + </Provider> ) expect(toJson(wrapper)).toMatchSnapshot() }) it('should call ConnectionLogin', () => { + useDispatchSpy.mockReturnValue(jest.fn()) + useSelectorSpy.mockReturnValue(globalStateData) const wrapper = mount( - <Connection fluidStatus={fluidStatusConnectedData[0]} /> + <Provider store={store}> + <Connection fluidStatus={fluidStatusConnectedData[0]} /> + </Provider> ) expect(toJson(wrapper)).toMatchSnapshot() }) diff --git a/src/components/Connection/Connection.tsx b/src/components/Connection/Connection.tsx index 0fae75cc5cabba0a142d7017479c35934c00c65f..61ba7c10aa30a149bc02a0e9eb80cce352d8d966 100644 --- a/src/components/Connection/Connection.tsx +++ b/src/components/Connection/Connection.tsx @@ -6,6 +6,8 @@ import { FluidStatus, FluidConnection } from 'models' import ConnectionLogin from 'components/Connection/ConnectionLogin' import ConnectionOauth from 'components/Connection/ConnectionOAuth' import './connection.scss' +import { FluidType } from 'enum/fluid.enum' +import SgeInit from './SGEConnect/SgeInit' interface ConnectionProps { fluidStatus: FluidStatus } @@ -24,9 +26,13 @@ const Connection: React.FC<ConnectionProps> = ({ }, [dispatch, fluidStatus.fluidType, fluidStatus.connection]) return ( <div className="konnector-form"> - {!fluidStatus.connection.konnectorConfig.oauth ? ( - <ConnectionLogin fluidStatus={fluidStatus} onSuccess={handleSuccess} /> - ) : ( + {fluidStatus.fluidType === FluidType.ELECTRICITY && ( + <SgeInit fluidStatus={fluidStatus} /> + )} + {fluidStatus.fluidType === FluidType.WATER && ( + <ConnectionLogin fluidStatus={fluidStatus} /> + )} + {fluidStatus.fluidType === FluidType.GAS && ( <ConnectionOauth fluidStatus={fluidStatus} onSuccess={handleSuccess} /> )} </div> diff --git a/src/components/Connection/ConnectionLogin.tsx b/src/components/Connection/ConnectionLogin.tsx index ae572a9ebc7ab629c580e9fd61e014ec51b825ed..0a410cd12584dfba44c1e106607fb5373ec3eea6 100644 --- a/src/components/Connection/ConnectionLogin.tsx +++ b/src/components/Connection/ConnectionLogin.tsx @@ -8,12 +8,10 @@ import ConnectionLoginNoPartnerAccount from './ConnectionLoginNoPartnerAccount' interface ConnectionLoginProps { fluidStatus: FluidStatus - onSuccess: () => Promise<void> } const ConnectionLogin: React.FC<ConnectionLoginProps> = ({ fluidStatus, - onSuccess, }: ConnectionLoginProps) => { const konnectorSlug: string = fluidStatus.connection.konnectorConfig.slug const siteLink: string = fluidStatus.connection.konnectorConfig.siteLink @@ -39,14 +37,12 @@ const ConnectionLogin: React.FC<ConnectionLoginProps> = ({ <ConnectionLoginWithPartnerAccount konnectorSlug={konnectorSlug} fluidStatus={fluidStatus} - handleSuccess={onSuccess} togglePartnerConnectionModal={togglePartnerConnectionModal} /> ) : ( <ConnectionLoginNoPartnerAccount konnectorSlug={konnectorSlug} fluidStatus={fluidStatus} - handleSuccess={onSuccess} togglePartnerConnectionModal={togglePartnerConnectionModal} /> )} diff --git a/src/components/Connection/ConnectionLoginNoPartnerAccount.tsx b/src/components/Connection/ConnectionLoginNoPartnerAccount.tsx index 29b8738dad26d30e62e1844bd23e17f04cd9aca4..da6a343c089daee9610f38e2e472468bae108e44 100644 --- a/src/components/Connection/ConnectionLoginNoPartnerAccount.tsx +++ b/src/components/Connection/ConnectionLoginNoPartnerAccount.tsx @@ -8,14 +8,12 @@ import FormLogin from 'components/Connection/FormLogin' interface ConnectionLoginNoPartnerAccountProps { konnectorSlug: string fluidStatus: FluidStatus - handleSuccess: () => Promise<void> togglePartnerConnectionModal: () => void } const ConnectionLoginNoPartnerAccount = ({ konnectorSlug, fluidStatus, - handleSuccess, togglePartnerConnectionModal, }: ConnectionLoginNoPartnerAccountProps) => { const { t } = useI18n() @@ -49,11 +47,7 @@ const ConnectionLoginNoPartnerAccount = ({ {t('auth.' + `${konnectorSlug}` + '.no_account.subtitle2_info')} </div> <div className="kloginform-connect-button"> - <FormLogin - fluidStatus={fluidStatus} - highlightedStyle={false} - handleSuccess={handleSuccess} - /> + <FormLogin fluidStatus={fluidStatus} highlightedStyle={false} /> </div> </div> ) diff --git a/src/components/Connection/ConnectionLoginWithPartnerAccount.tsx b/src/components/Connection/ConnectionLoginWithPartnerAccount.tsx index 242e84c8bd860af204b80862b68b261d8d3a4652..9da0f6abcbb38b8cd22395a34cd086f57894268c 100644 --- a/src/components/Connection/ConnectionLoginWithPartnerAccount.tsx +++ b/src/components/Connection/ConnectionLoginWithPartnerAccount.tsx @@ -8,14 +8,12 @@ import FormLogin from 'components/Connection/FormLogin' interface ConnectionLoginWithPartnerAccountProps { konnectorSlug: string fluidStatus: FluidStatus - handleSuccess: () => Promise<void> togglePartnerConnectionModal: () => void } const ConnectionLoginWithPartnerAccount = ({ konnectorSlug, fluidStatus, - handleSuccess, togglePartnerConnectionModal, }: ConnectionLoginWithPartnerAccountProps) => { const { t } = useI18n() @@ -37,11 +35,7 @@ const ConnectionLoginWithPartnerAccount = ({ {t('auth.' + konnectorSlug + '.with_account.subtitle1')} </div> <div className="kloginform-connect-button"> - <FormLogin - fluidStatus={fluidStatus} - highlightedStyle={true} - handleSuccess={handleSuccess} - /> + <FormLogin fluidStatus={fluidStatus} highlightedStyle={true} /> </div> {konnectorSlug === 'grdfgrandlyon' && ( <div className="kloginform-infotext text-16-normal"> diff --git a/src/components/Connection/ConnectionNotFound.spec.tsx b/src/components/Connection/ConnectionNotFound.spec.tsx index 73dd07fae8dd3b763075bbe778c6effa1279a557..fec1c0bf1dc7f0c37812b43a5474da5a2119d514 100644 --- a/src/components/Connection/ConnectionNotFound.spec.tsx +++ b/src/components/Connection/ConnectionNotFound.spec.tsx @@ -14,7 +14,7 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }) describe('ConnectionNotFound component test', () => { - const konnectorSlug = 'enedisgrandlyon' + const konnectorSlug = 'enedis-sge-grandlyon' it('should correctly render connection not found', () => { const result = shallow( @@ -31,7 +31,7 @@ describe('ConnectionNotFound component test', () => { submitStyledButton.simulate('click') expect(global.open).toHaveBeenCalledWith( - 'http://localhost/#/discover/enedisgrandlyon', + 'http://localhost/#/discover/enedis-sge-grandlyon', '_blank' ) }) diff --git a/src/components/Connection/FormLogin.tsx b/src/components/Connection/FormLogin.tsx index 3d2f9674e67d63f5bf8c4621194ecc0113d8b9fb..0455d1265fc143e524f7ceeadb9148d45940ff4b 100644 --- a/src/components/Connection/FormLogin.tsx +++ b/src/components/Connection/FormLogin.tsx @@ -1,13 +1,6 @@ import React, { useState, useEffect } from 'react' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { useClient } from 'cozy-client' -import { useDispatch } from 'react-redux' - -import { Account, FluidStatus, FluidConnection, UsageEvent } from 'models' -import AccountService from 'services/account.service' -import ConnectionService from 'services/connection.service' -import UsageEventService from 'services/usageEvent.service' - +import { Account, AccountAuthData, FluidStatus } from 'models' import './formLogin.scss' import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton' import Button from '@material-ui/core/Button' @@ -15,24 +8,18 @@ import TrailingIcon from 'assets/icons/ico/trailing-icon.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import { FluidType } from 'enum/fluid.enum' import { getPartnerPicto } from 'utils/picto' -import { UsageEventType } from 'enum/usageEvent.enum' -import { updatedFluidConnection } from 'store/global/global.actions' +import useKonnectorAuth from 'components/Hooks/useKonnectorAuth' interface FormLoginProps { fluidStatus: FluidStatus highlightedStyle?: boolean - handleSuccess: () => Promise<void> } const FormLogin: React.FC<FormLoginProps> = ({ fluidStatus, highlightedStyle = true, - handleSuccess, }: FormLoginProps) => { const { t } = useI18n() - const client = useClient() - const dispatch = useDispatch() - const konnectorSlug: string = fluidStatus.connection.konnectorConfig.slug const lastKnownCredentials: string | undefined = fluidStatus.connection.konnectorConfig.lastKnownCredentials @@ -45,6 +32,11 @@ const FormLogin: React.FC<FormLoginProps> = ({ const [loading, setLoading] = useState<boolean>(false) const icon = getPartnerPicto(konnectorSlug, highlightedStyle) + const [connect, update, connectError] = useKonnectorAuth( + fluidStatus, + login, + password + ) const changeLogin = (value: string) => { if ((/[0-9]/.test(value) && value.length <= 7) || value === '') { @@ -69,66 +61,6 @@ const FormLogin: React.FC<FormLoginProps> = ({ } } - const sendUsageEventError = async ( - konnectorSlug: string - ): Promise<UsageEvent> => { - return UsageEventService.addEvent(client, { - type: UsageEventType.KONNECTOR_CONNECT_EVENT, - target: konnectorSlug, - result: 'error', - }) - } - - const connect = async () => { - const connectionService = new ConnectionService(client) - try { - // If first connexion, send the usage event - await UsageEventService.addEvent(client, { - type: UsageEventType.KONNECTOR_ATTEMPT_EVENT, - target: konnectorSlug, - result: 'error', - }) - const { account: _account, trigger: _trigger } = - await connectionService.connectNewUser(konnectorSlug, login, password) - if (!_trigger) { - setError(t('konnector_form.error_account_creation')) - sendUsageEventError(konnectorSlug) - return null - } - const updatedConnection: FluidConnection = { - ...fluidStatus.connection, - account: _account, - trigger: _trigger, - } - setLoading(false) - dispatch(updatedFluidConnection(fluidStatus.fluidType, updatedConnection)) - handleSuccess() - } catch (err) { - setLoading(false) - sendUsageEventError(konnectorSlug) - console.log(err) - } - } - - const update = async () => { - if (fluidStatus.connection.account) { - const _account = fluidStatus.connection.account - const auth = { - login: login, - password: password, - } - _account.auth = auth - const accountService = new AccountService(client) - const updatedAccount = await accountService.updateAccount(_account) - const updatedConnection: FluidConnection = { - ...fluidStatus.connection, - account: updatedAccount, - } - dispatch(updatedFluidConnection(fluidStatus.fluidType, updatedConnection)) - handleSuccess() - } - } - const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => { e.preventDefault() try { @@ -141,6 +73,7 @@ const FormLogin: React.FC<FormLoginProps> = ({ } if (!account) { await connect() + setLoading(false) } else { await update() } @@ -149,10 +82,14 @@ const FormLogin: React.FC<FormLoginProps> = ({ } } + useEffect(() => { + if (connectError) setError(connectError) + }, [connectError]) + useEffect(() => { if (account?.auth) { const auth = account.auth - const authData = auth + const authData = auth as AccountAuthData if (authData.login) { setLogin(authData.login) } diff --git a/src/components/Connection/SGEConnect/SgeConnect.scss b/src/components/Connection/SGEConnect/SgeConnect.scss new file mode 100644 index 0000000000000000000000000000000000000000..f3d4efd554adb256b003656ecdbd1b6147a79d95 --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeConnect.scss @@ -0,0 +1,74 @@ +@import 'src/styles/base/color'; +@import 'src/styles/base/mixins'; +.sge-view { + // background: $dark-2; + box-sizing: border-box; + min-height: inherit; + width: inherit; + padding: 1rem; + padding-bottom: 4rem; + .sge-step-container { + color: $grey-bright; + .title, + .head { + margin-top: 1.5rem; + } + label { + display: block; + margin-top: 1rem; + margin-bottom: 0.625rem; + } + #zipCode { + max-width: 115px; + } + @include checkBox(); + input:not([type='checkbox']) { + appearance: none; + max-width: 280px; + width: 100%; + height: 45px; + border-radius: 4px; + border: 1px solid $grey-dark; + background: rgba(0, 0, 0, 0.3); + transition: all 300ms ease; + color: $grey-bright; + padding: 0 0.5rem; + &:focus, + &:focus-visible { + outline: 1px solid $gold-shadow; + } + } + /* Chrome, Safari, Edge, Opera */ + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + /* Firefox */ + input[type='number'] { + -moz-appearance: textfield; + } + .pdl-hint { + cursor: pointer; + border-bottom: solid 1px $grey-bright; + text-align: center; + margin: 1rem auto; + padding: 0.2rem; + width: 175px; + } + ul { + padding: 0 1rem; + line-height: 130%; + li { + margin: 0.5rem 0; + } + } + } +} +.sgeHintModal { + text-align: center; + .title { + color: $gold-shadow; + margin: 1rem 0; + } +} diff --git a/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx b/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..5f768c23a1bbb35bbee5ea95f74701d92777469a --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx @@ -0,0 +1,152 @@ +import React from 'react' +import { mount } from 'enzyme' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' +import toJson from 'enzyme-to-json' +import SgeConnectView from './SgeConnectView' +import * as reactRedux from 'react-redux' +import { SgeStep } from 'enum/sgeStep.enum' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +jest.mock('components/Content/Content', () => 'mock-content') +jest.mock('components/FormGlobal/FormProgress', () => 'mock-formprogress') + +const mockStore = configureStore([]) +const useDispatchSpy = jest.spyOn(reactRedux, 'useDispatch') + +describe('SgeConnectView component', () => { + beforeEach(() => { + useDispatchSpy.mockReset() + }) + it('should be rendered correctly', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('should render address Step', () => { + const store = mockStore({ + ecolyo: { + global: { + ...globalStateData, + sgeConnect: { + ...globalStateData.sgeConnect, + currentStep: SgeStep.Address, + }, + }, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + expect(wrapper.find('.stepAddress')).toBeTruthy() + }) + it('should render identity Step', () => { + const store = mockStore({ + ecolyo: { + global: { + ...globalStateData, + sgeConnect: { + ...globalStateData.sgeConnect, + currentStep: SgeStep.IdentityAndPDL, + }, + }, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + expect(wrapper.find('.stepIdentity')).toBeTruthy() + }) + it('should render consent Step', () => { + const store = mockStore({ + ecolyo: { + global: { + ...globalStateData, + sgeConnect: { + ...globalStateData.sgeConnect, + currentStep: SgeStep.Consent, + }, + }, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + expect(wrapper.find('.stepConsent')).toBeTruthy() + }) + it('should render default Step', () => { + const store = mockStore({ + ecolyo: { + global: { + ...globalStateData, + sgeConnect: { + ...globalStateData.sgeConnect, + currentStep: 99, + }, + }, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + expect(wrapper.find('.stepIdentity')).toBeTruthy() + }) + describe('SgeConnectView Navigation methods', () => { + beforeEach(() => { + useDispatchSpy.mockReset() + }) + it('should call nextStep method', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + wrapper.find('.profile-navigation-button').last().simulate('click') + expect(useDispatchSpy).toHaveBeenCalled() + }) + it('shouldnt call disabled nextStep method', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + wrapper.find('.profile-navigation-button').last().simulate('click') + expect(useDispatchSpy).toHaveBeenCalled() + }) + }) +}) diff --git a/src/components/Connection/SGEConnect/SgeConnectView.tsx b/src/components/Connection/SGEConnect/SgeConnectView.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0aac63fb4b8e5fe8a241db77ac4e1c8a39e95bfc --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeConnectView.tsx @@ -0,0 +1,141 @@ +import React, { useCallback, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { AppStore } from 'store' +import CozyBar from 'components/Header/CozyBar' +import Content from 'components/Content/Content' +import Header from 'components/Header/Header' +import { SgeStep } from 'enum/sgeStep.enum' +import StepIdentityAndPdl from './StepIdentityAndPdl' +import StepAddress from './StepAddress' +import StepConsent from './StepConsent' +import './SgeConnect.scss' +import FormNavigation from 'components/FormGlobal/FormNavigation' +import { SgeStore } from 'models/sgeStore.model' +import { updateSgeStore } from 'store/global/global.actions' +import FormProgress from 'components/FormGlobal/FormProgress' + +const SgeConnectView: React.FC = () => { + const [headerHeight, setHeaderHeight] = useState<number>(0) + const { sgeConnect } = useSelector((state: AppStore) => state.ecolyo.global) + const dispatch = useDispatch() + const [currentStep, setcurrentStep] = useState<SgeStep>( + sgeConnect.currentStep + ) + const [currentSgeState, setcurrentSgeState] = useState<SgeStore>(sgeConnect) + const defineHeaderHeight = useCallback((height: number) => { + setHeaderHeight(height) + }, []) + + const isNextValid = useCallback(() => { + switch (currentStep) { + case SgeStep.IdentityAndPDL: + return ( + currentSgeState.firstName !== '' && + currentSgeState.lastName !== '' && + currentSgeState.pdl !== null && + currentSgeState.pdl.toString().length === 14 + ) + case SgeStep.Address: + return ( + currentSgeState.address !== '' && + currentSgeState.city !== '' && + currentSgeState.zipCode !== null && + currentSgeState.zipCode.toString().length === 5 + ) + case SgeStep.Consent: + return currentSgeState.dataConsent && currentSgeState.pdlConfirm + default: + return false + } + }, [ + currentSgeState.address, + currentSgeState.city, + currentSgeState.dataConsent, + currentSgeState.firstName, + currentSgeState.lastName, + currentSgeState.pdl, + currentSgeState.pdlConfirm, + currentSgeState.zipCode, + currentStep, + ]) + + const handleNext = useCallback(() => { + if (currentStep < SgeStep.Consent && isNextValid()) { + setcurrentStep(prev => prev + 1) + dispatch(updateSgeStore(currentSgeState)) + } + if (currentStep === SgeStep.Consent && isNextValid()) { + const updatedState = { + ...currentSgeState, + shouldLaunchAccount: true, + } + setcurrentSgeState(updatedState) + dispatch(updateSgeStore(updatedState)) + } + }, [currentSgeState, currentStep, dispatch, isNextValid]) + + const handlePrev = useCallback(() => { + if (currentStep !== SgeStep.IdentityAndPDL) { + setcurrentStep(prev => prev - 1) + } + dispatch(updateSgeStore(currentSgeState)) + }, [currentSgeState, currentStep, dispatch]) + + const onChange = useCallback( + (objkey: string, value: string | boolean | number, maxLength?: number) => { + if ( + !maxLength || // optionnal ? + value === '' || + (/[0-9]/.test(value.toString()) && value.toString().length <= maxLength) + ) { + const updatedState = { + ...currentSgeState, + [objkey]: value, + } + setcurrentSgeState(updatedState) + } + }, + [currentSgeState] + ) + + const renderStep = (step: SgeStep) => { + switch (step) { + case SgeStep.Address: + return <StepAddress sgeState={currentSgeState} onChange={onChange} /> + case SgeStep.Consent: + return <StepConsent sgeState={currentSgeState} onChange={onChange} /> + case SgeStep.IdentityAndPDL: + default: + return ( + <StepIdentityAndPdl sgeState={currentSgeState} onChange={onChange} /> + ) + } + } + + return ( + <> + <CozyBar titleKey={'common.title_sge_connect'} displayBackArrow={true} /> + <Header + setHeaderHeight={defineHeaderHeight} + desktopTitleKey={'common.title_sge_connect'} + displayBackArrow={true} + ></Header> + <Content height={headerHeight}> + <div className="sge-view"> + <FormProgress step={currentStep} formType={'sge'} /> + {renderStep(currentStep)} + <FormNavigation + step={currentStep} + handlePrevious={handlePrev} + handleNext={handleNext} + disableNextButton={!isNextValid()} + isEcogesture={false} + isLastConnectStep={currentStep === SgeStep.Consent} + /> + </div> + </Content> + </> + ) +} + +export default SgeConnectView diff --git a/src/components/Connection/SGEConnect/SgeInit.spec.tsx b/src/components/Connection/SGEConnect/SgeInit.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1b093367e95dd2fbfb4c4bc9534f9b85330b76dd --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeInit.spec.tsx @@ -0,0 +1,103 @@ +import React from 'react' +import { mount } from 'enzyme' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import SgeInit from './SgeInit' +import { + fluidStatusData, + SgeStatusWithAccout, +} from '../../../../tests/__mocks__/fluidStatusData.mock' +import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' +import toJson from 'enzyme-to-json' +import { Button } from '@material-ui/core' +import { waitForComponentToPaint } from '../../../../tests/__mocks__/testUtils' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +const mockHistoryPush = jest.fn() +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: () => ({ + push: mockHistoryPush, + }), +})) + +const mockConnect = jest.fn() +const mockUpdate = jest.fn() + +jest.mock('components/Hooks/useKonnectorAuth', () => + jest.fn(() => [mockConnect, mockUpdate]) +) +const mockStore = configureStore([]) + +describe('SgeInit component', () => { + it('should be rendered correctly', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeInit fluidStatus={fluidStatusData[0]} /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('should go to sge connect steps', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeInit fluidStatus={fluidStatusData[0]} /> + </Provider> + ) + wrapper.find(Button).first().simulate('click') + expect(mockHistoryPush).toHaveBeenCalled() + }) + it('should launch account and trigger creation process', async () => { + const store = mockStore({ + ecolyo: { + global: { + ...globalStateData, + sgeConnect: { shouldLaunchAccount: true }, + }, + }, + }) + + const wrapper = mount( + <Provider store={store}> + <SgeInit fluidStatus={fluidStatusData[0]} /> + </Provider> + ) + await waitForComponentToPaint(wrapper) + expect(mockConnect).toHaveBeenCalled() + }) + it('should launch existing account update process', async () => { + const store = mockStore({ + ecolyo: { + global: { + ...globalStateData, + sgeConnect: { shouldLaunchAccount: true }, + }, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeInit fluidStatus={SgeStatusWithAccout} /> + </Provider> + ) + await waitForComponentToPaint(wrapper) + expect(mockUpdate).toHaveBeenCalled() + }) +}) diff --git a/src/components/Connection/SGEConnect/SgeInit.tsx b/src/components/Connection/SGEConnect/SgeInit.tsx new file mode 100644 index 0000000000000000000000000000000000000000..94b1463429e2cf4a8f814929c1dbb97bc91dc9fe --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeInit.tsx @@ -0,0 +1,69 @@ +import React, { useEffect } from 'react' + +import { Account, FluidStatus } from 'models' +import { Icon, useI18n } from 'cozy-ui/transpiled/react/I18n' +import { Button } from '@material-ui/core' +import { decoreText } from 'utils/decoreText' +import ElectricityBillIcon from 'assets/icons/visu/partnerSteps/electricity_bill.svg' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import { useHistory } from 'react-router-dom' +import { useDispatch, useSelector } from 'react-redux' +import { AppStore } from 'store' +import useKonnectorAuth from 'components/Hooks/useKonnectorAuth' +import { updateSgeStore } from 'store/global/global.actions' +interface SgeInitProps { + fluidStatus: FluidStatus +} + +const SgeInit: React.FC<SgeInitProps> = ({ fluidStatus }: SgeInitProps) => { + const { t } = useI18n() + const history = useHistory() + const konnectorSlug: string = fluidStatus.connection.konnectorConfig.slug + const account: Account | null = fluidStatus.connection.account + const { sgeConnect } = useSelector((state: AppStore) => state.ecolyo.global) + const dispatch = useDispatch() + const [connect, update] = useKonnectorAuth(fluidStatus) + + useEffect(() => { + async function launchConnect() { + if (sgeConnect.shouldLaunchAccount) { + dispatch(updateSgeStore({ ...sgeConnect, shouldLaunchAccount: false })) + if (!account) { + await connect() + } else { + await update() + } + } + } + launchConnect() + }, [account, connect, dispatch, sgeConnect, update]) + + return ( + <div className="kloginform sge-connect"> + <p className={`kloginform-title ${konnectorSlug} text-20-bold`}> + {t(`auth.${konnectorSlug}.title`)} + </p> + <StyledIcon icon={ElectricityBillIcon} size={180} /> + <p className={`sge-subtitle ${konnectorSlug} text-16-regular`}> + {decoreText(t('auth.' + `${konnectorSlug}` + '.bill'))} + </p> + + <div className="kloginform-button"> + <Button + aria-label={t(`auth.${konnectorSlug}.accessibility.connect`)} + onClick={() => { + history.push('/sge-connect') + }} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + > + {t(`auth.${konnectorSlug}.connect`)} + </Button> + </div> + </div> + ) +} + +export default SgeInit diff --git a/src/components/Connection/SGEConnect/SgeModalHint.spec.tsx b/src/components/Connection/SGEConnect/SgeModalHint.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c5513c1ef3fa9516d79d96f6f6338f8c0674d2c6 --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeModalHint.spec.tsx @@ -0,0 +1,35 @@ +import React from 'react' +import { mount } from 'enzyme' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' +import toJson from 'enzyme-to-json' +import SgeModalHint from './SgeModalHint' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +const mockStore = configureStore([]) + +describe('SgeModalHint component', () => { + it('should be rendered correctly', () => { + const mockClose = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeModalHint open={true} handleCloseClick={mockClose} /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) +}) diff --git a/src/components/Connection/SGEConnect/SgeModalHint.tsx b/src/components/Connection/SGEConnect/SgeModalHint.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f11c911e9034570c677efb52213629112d08bb7a --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeModalHint.tsx @@ -0,0 +1,65 @@ +import React from 'react' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Button from '@material-ui/core/Button' +import Dialog from '@material-ui/core/Dialog' +import CloseIcon from 'assets/icons/ico/close.svg' +import PdlImage from 'assets/icons/visu/pdl-image.svg' +import { IconButton } from '@material-ui/core' +import Icon from 'cozy-ui/transpiled/react/Icon' + +interface SgeModalHintProps { + open: boolean + handleCloseClick: () => void +} + +const SgeModalHint: React.FC<SgeModalHintProps> = ({ + open, + handleCloseClick, +}: SgeModalHintProps) => { + const { t } = useI18n() + + return ( + <Dialog + open={open} + disableEscapeKeyDown + onClose={handleCloseClick} + aria-labelledby={'accessibility-title'} + classes={{ + root: 'modal-root', + paper: 'modal-paper', + }} + > + <div id={'accessibility-title'}> + {t('challenge_no_fluid_modal.accessibility.window_title')} + </div> + <IconButton + aria-label={t('feedback.accessibility.button_close')} + className="modal-paper-close-button" + onClick={handleCloseClick} + > + <Icon icon={CloseIcon} size={16} /> + </IconButton> + <div className="sgeHintModal"> + <div className="title text-20-bold"> + {t('auth.enedis-sge-grandlyon.modalHint.title')} + </div> + <Icon icon={PdlImage} width={240} height={385} /> + <Button + aria-label={t( + 'auth.enedis-sge-grandlyon.modalHint.button-accessibility' + )} + onClick={handleCloseClick} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + style={{ height: '40px' }} + > + {t('auth.enedis-sge-grandlyon.modalHint.button')} + </Button> + </div> + </Dialog> + ) +} + +export default SgeModalHint diff --git a/src/components/Connection/SGEConnect/StepAddress.spec.tsx b/src/components/Connection/SGEConnect/StepAddress.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1feceb56978266b535db4e84d1ff66368ed4e910 --- /dev/null +++ b/src/components/Connection/SGEConnect/StepAddress.spec.tsx @@ -0,0 +1,110 @@ +import React from 'react' +import { mount } from 'enzyme' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' +import toJson from 'enzyme-to-json' +import SgeModalHint from './SgeModalHint' +import StepAddress from './StepAddress' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +const mockStore = configureStore([]) + +describe('StepAddress component', () => { + it('should be rendered correctly', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepAddress + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('should change address value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepAddress + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#address').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('address', '') + }) + it('should change zipCode value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepAddress + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#zipCode').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('zipCode', '', 5) + }) + it('should have an existing zipCode value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepAddress + sgeState={{ ...globalStateData.sgeConnect, zipCode: 69200 }} + onChange={mockHandleChange} + /> + </Provider> + ) + expect(wrapper.find('#zipCode').first().props().value).toBe(69200) + }) + it('should change city value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepAddress + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#city').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('city', '') + }) +}) diff --git a/src/components/Connection/SGEConnect/StepAddress.tsx b/src/components/Connection/SGEConnect/StepAddress.tsx new file mode 100644 index 0000000000000000000000000000000000000000..6bc09cad76533dd33e972baf59910f4ce25d68c9 --- /dev/null +++ b/src/components/Connection/SGEConnect/StepAddress.tsx @@ -0,0 +1,62 @@ +import React from 'react' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { SgeStore } from 'models/sgeStore.model' + +interface StepAddressProps { + sgeState: SgeStore + onChange: (key: string, value: string, maxLength?: number) => void +} + +const StepAddress: React.FC<StepAddressProps> = ({ + sgeState, + onChange, +}: StepAddressProps) => { + const { t } = useI18n() + return ( + <div className="sge-step-container stepAddress"> + <div className="title text-22-bold"> + {t('auth.enedis-sge-grandlyon.addressTitle')} + </div> + <label htmlFor="address" className="text-16-normal"> + {t('auth.enedis-sge-grandlyon.address')} + </label> + <input + type="text" + id="address" + name="address" + value={sgeState.address} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('address', e.target.value) + } + /> + <label htmlFor="zipCode" className="text-16-normal"> + {t('auth.enedis-sge-grandlyon.zipCode')} + </label> + <input + type="number" + min={0} + id="zipCode" + name="zipCode" + value={sgeState.zipCode !== null ? sgeState.zipCode : undefined} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('zipCode', e.target.value, 5) + } + /> + + <label htmlFor="city" className="text-16-normal"> + {t('auth.enedis-sge-grandlyon.city')} + </label> + <input + type="text" + id="city" + name="city" + value={sgeState.city} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('city', e.target.value) + } + /> + </div> + ) +} + +export default StepAddress diff --git a/src/components/Connection/SGEConnect/StepConsent.spec.tsx b/src/components/Connection/SGEConnect/StepConsent.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..985082b68f6aeea772e9df4dd723cb85fac38d72 --- /dev/null +++ b/src/components/Connection/SGEConnect/StepConsent.spec.tsx @@ -0,0 +1,74 @@ +import React from 'react' +import { mount } from 'enzyme' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' +import toJson from 'enzyme-to-json' +import StepConsent from './StepConsent' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +const mockStore = configureStore([]) + +describe('StepConsent component', () => { + it('should be rendered correctly', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepConsent + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('should change pdlConfirm value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepConsent + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#pdlConfirm').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('pdlConfirm', false) + }) + it('should change dataConsent value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepConsent + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#dataConsent').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('dataConsent', false) + }) +}) diff --git a/src/components/Connection/SGEConnect/StepConsent.tsx b/src/components/Connection/SGEConnect/StepConsent.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4386d90ff99aa1c6f9327800eb612a273ff51345 --- /dev/null +++ b/src/components/Connection/SGEConnect/StepConsent.tsx @@ -0,0 +1,68 @@ +import React from 'react' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { decoreText } from 'utils/decoreText' +import classNames from 'classnames' +import { SgeStore } from 'models/sgeStore.model' + +interface StepConsentProps { + sgeState: SgeStore + onChange: (key: string, value: boolean, maxLength?: number) => void +} +const StepConsent: React.FC<StepConsentProps> = ({ + sgeState, + onChange, +}: StepConsentProps) => { + const { t } = useI18n() + + return ( + <div className="sge-step-container stepConsent"> + <div className="head text-16-normal"> + {t('auth.enedis-sge-grandlyon.headConsent')} + </div> + <div className="title text-22-bold"> + {t('auth.enedis-sge-grandlyon.textConsent')} + </div> + <ul className="text-16-normal"> + <li>{t('auth.enedis-sge-grandlyon.consentLi1')}</li> + <li>{t('auth.enedis-sge-grandlyon.consentLi2')}</li> + <li>{t('auth.enedis-sge-grandlyon.consentLi3')}</li> + <li>{t('auth.enedis-sge-grandlyon.consentLi4')}</li> + </ul> + <hr /> + <label + className={classNames('checkbox', { + ['answer-checked']: sgeState.dataConsent, + })} + > + <input + id="dataConsent" + type="checkbox" + name="Data-consent-validation" + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('dataConsent', e.target.checked) + } + checked={sgeState.dataConsent} + /> + <span>{decoreText(t('auth.enedis-sge-grandlyon.consentCheck1'))}</span> + </label> + <label + className={classNames('checkbox', { + ['answer-checked']: sgeState.pdlConfirm, + })} + > + <input + id="pdlConfirm" + type="checkbox" + name="Data-consent-validation" + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('pdlConfirm', e.target.checked) + } + checked={sgeState.pdlConfirm} + /> + {decoreText(t('auth.enedis-sge-grandlyon.consentCheck2'))} + </label> + </div> + ) +} + +export default StepConsent diff --git a/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx b/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4a6ffacf3c40c7e37edefbd4a17850a317ad8ee4 --- /dev/null +++ b/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx @@ -0,0 +1,127 @@ +import React from 'react' +import { mount } from 'enzyme' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' +import toJson from 'enzyme-to-json' +import StepIdentityAndPdl from './StepIdentityAndPdl' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +const mockStore = configureStore([]) + +describe('StepIdentityAndPdl component', () => { + it('should be rendered correctly', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepIdentityAndPdl + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('should change firstName value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepIdentityAndPdl + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#firstName').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('firstName', '') + }) + it('should change lastName value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepIdentityAndPdl + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#lastName').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('lastName', '') + }) + it('should change pdl value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepIdentityAndPdl + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#pdl').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('pdl', '', 14) + }) + it('should open hint modal', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepIdentityAndPdl + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('.pdl-hint').first().simulate('click') + expect(wrapper.find('.sgeHintModal')).toBeTruthy() + }) + it('should have an existing pdl value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepIdentityAndPdl + sgeState={{ ...globalStateData.sgeConnect, pdl: 11111111111111 }} + onChange={mockHandleChange} + /> + </Provider> + ) + expect(wrapper.find('#pdl').first().props().value).toBe(11111111111111) + }) +}) diff --git a/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx b/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx new file mode 100644 index 0000000000000000000000000000000000000000..2eb3f7d8033f71c9ec49be90fc4d86e0e53154c1 --- /dev/null +++ b/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx @@ -0,0 +1,78 @@ +import React, { useCallback, useState } from 'react' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { SgeStore } from 'models/sgeStore.model' +import SgeModalHint from 'components/Connection/SGEConnect/SgeModalHint' + +interface StepIdentityAndPdlProps { + sgeState: SgeStore + onChange: (key: string, value: string | number, maxLength?: number) => void +} + +const StepIdentityAndPdl: React.FC<StepIdentityAndPdlProps> = ({ + sgeState, + onChange, +}: StepIdentityAndPdlProps) => { + const { t } = useI18n() + const [openHintModal, setopenHintModal] = useState<boolean>(false) + const toggleModal = useCallback(() => { + setopenHintModal(prev => !prev) + }, []) + + return ( + <div className="sge-step-container stepIdentity"> + <div className="title text-22-bold"> + {t('auth.enedis-sge-grandlyon.identityTitle')} + </div> + <label htmlFor="firstName" className="text-16-normal"> + {t('auth.enedis-sge-grandlyon.firstName')} + </label> + <input + type="text" + id="firstName" + name="firstName" + value={sgeState.firstName} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('firstName', e.target.value) + } + required + /> + <label htmlFor="lastName" className="text-16-normal"> + {t('auth.enedis-sge-grandlyon.lastName')} + </label> + <input + type="text" + id="lastName" + name="lastName" + value={sgeState.lastName} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('lastName', e.target.value) + } + required + /> + <div className="title text-22-bold"> + {t('auth.enedis-sge-grandlyon.pdlTitle')} + </div> + <label htmlFor="pdl" className="text-16-normal"> + {t('auth.enedis-sge-grandlyon.pdlLabel')} + </label> + <input + id="pdl" + name="pdl" + type="number" + min={0} + value={sgeState.pdl ? sgeState.pdl : undefined} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('pdl', e.target.value, 14) + } + inputMode="numeric" + required + /> + <div onClick={toggleModal} className="pdl-hint text-16-normal"> + {t('auth.enedis-sge-grandlyon.pdlHint')} + </div> + <SgeModalHint open={openHintModal} handleCloseClick={toggleModal} /> + </div> + ) +} + +export default StepIdentityAndPdl diff --git a/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..0df9ef955f56ff83e3b72f8edac8304b4cc095c1 --- /dev/null +++ b/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap @@ -0,0 +1,1318 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`SgeConnectView component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <SgeConnectView> + <CozyBar + displayBackArrow={true} + titleKey="common.title_sge_connect" + > + <BarLeft> + <StyledIconButton + aria-label="header.accessibility.button_back" + className="cv-button" + icon="test-file-stub" + onClick={[Function]} + > + <WithStyles(WithStyles(ForwardRef(IconButton))) + aria-label="header.accessibility.button_back" + className="cv-button" + onClick={[Function]} + > + <WithStyles(ForwardRef(IconButton)) + aria-label="header.accessibility.button_back" + className="cv-button" + classes={ + Object { + "root": "WithStyles(ForwardRef(IconButton))-root-1", + } + } + onClick={[Function]} + > + <ForwardRef(IconButton) + aria-label="header.accessibility.button_back" + className="cv-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="header.accessibility.button_back" + centerRipple={true} + className="MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 cv-button" + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <ForwardRef(ButtonBase) + aria-label="header.accessibility.button_back" + centerRipple={true} + className="MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 cv-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <button + aria-label="header.accessibility.button_back" + className="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 cv-button" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <StyledIcon + icon="test-file-stub" + size={16} + > + <Icon + aria-hidden={true} + icon="test-file-stub" + size={16} + spin={false} + > + <Component + aria-hidden={true} + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <svg + aria-hidden={true} + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </StyledIcon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + </WithStyles(WithStyles(ForwardRef(IconButton)))> + </StyledIconButton> + </BarLeft> + <BarCenter> + <div + className="cozy-bar" + > + <span + className="app-title" + > + common.title_sge_connect + </span> + </div> + </BarCenter> + <BarRight> + <StyledIconButton + aria-label="header.accessibility.button_open_feedbacks" + className="cv-button" + icon="test-file-stub" + onClick={[Function]} + size={40} + > + <WithStyles(WithStyles(ForwardRef(IconButton))) + aria-label="header.accessibility.button_open_feedbacks" + className="cv-button" + onClick={[Function]} + > + <WithStyles(ForwardRef(IconButton)) + aria-label="header.accessibility.button_open_feedbacks" + className="cv-button" + classes={ + Object { + "root": "WithStyles(ForwardRef(IconButton))-root-1", + } + } + onClick={[Function]} + > + <ForwardRef(IconButton) + aria-label="header.accessibility.button_open_feedbacks" + className="cv-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="header.accessibility.button_open_feedbacks" + centerRipple={true} + className="MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 cv-button" + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <ForwardRef(ButtonBase) + aria-label="header.accessibility.button_open_feedbacks" + centerRipple={true} + className="MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 cv-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <button + aria-label="header.accessibility.button_open_feedbacks" + className="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 cv-button" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <StyledIcon + icon="test-file-stub" + size={40} + > + <Icon + aria-hidden={true} + icon="test-file-stub" + size={40} + spin={false} + > + <Component + aria-hidden={true} + className="styles__icon___23x3R" + height={40} + style={Object {}} + width={40} + > + <svg + aria-hidden={true} + className="styles__icon___23x3R" + height={40} + style={Object {}} + width={40} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </StyledIcon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + </WithStyles(WithStyles(ForwardRef(IconButton)))> + </StyledIconButton> + </BarRight> + </CozyBar> + <Header + desktopTitleKey="common.title_sge_connect" + displayBackArrow={true} + setHeaderHeight={[Function]} + > + <div + className="header" + > + <div + className="header-top" + > + <div + className="header-content" + > + <div + className="header-content-top" + > + <div + className="header-text-desktop text-14-normal-uppercase" + > + <WithStyles(ForwardRef(IconButton)) + aria-label="header.accessibility.button_back" + className="header-back-button" + onClick={[Function]} + > + <ForwardRef(IconButton) + aria-label="header.accessibility.button_back" + className="header-back-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="header.accessibility.button_back" + centerRipple={true} + className="MuiIconButton-root header-back-button" + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <ForwardRef(ButtonBase) + aria-label="header.accessibility.button_back" + centerRipple={true} + className="MuiIconButton-root header-back-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <button + aria-label="header.accessibility.button_back" + className="MuiButtonBase-root MuiIconButton-root header-back-button" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <Icon + icon="test-file-stub" + size={16} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <svg + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + <span> + common.title_sge_connect + </span> + </div> + <WithStyles(ForwardRef(IconButton)) + aria-label="header.accessibility.button_open_feedbacks" + className="header-feedbacks-button" + onClick={[Function]} + > + <ForwardRef(IconButton) + aria-label="header.accessibility.button_open_feedbacks" + className="header-feedbacks-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="header.accessibility.button_open_feedbacks" + centerRipple={true} + className="MuiIconButton-root header-feedbacks-button" + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <ForwardRef(ButtonBase) + aria-label="header.accessibility.button_open_feedbacks" + centerRipple={true} + className="MuiIconButton-root header-feedbacks-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <button + aria-label="header.accessibility.button_open_feedbacks" + className="MuiButtonBase-root MuiIconButton-root header-feedbacks-button" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <Icon + icon="test-file-stub" + size={40} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={40} + style={Object {}} + width={40} + > + <svg + className="styles__icon___23x3R" + height={40} + style={Object {}} + width={40} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + </div> + </div> + </div> + <div + className="header-bar" + /> + </div> + </Header> + <mock-content + height={-48} + > + <div + className="sge-view" + > + <mock-formprogress + formType="sge" + step={0} + /> + <StepIdentityAndPdl + onChange={[Function]} + sgeState={ + Object { + "address": "", + "city": "", + "currentStep": 0, + "dataConsent": false, + "firstName": "", + "lastName": "", + "pdl": null, + "pdlConfirm": false, + "shouldLaunchAccount": false, + "zipCode": null, + } + } + > + <div + className="sge-step-container stepIdentity" + > + <div + className="title text-22-bold" + > + auth.enedis-sge-grandlyon.identityTitle + </div> + <label + className="text-16-normal" + htmlFor="firstName" + > + auth.enedis-sge-grandlyon.firstName + </label> + <input + id="firstName" + name="firstName" + onChange={[Function]} + required={true} + type="text" + value="" + /> + <label + className="text-16-normal" + htmlFor="lastName" + > + auth.enedis-sge-grandlyon.lastName + </label> + <input + id="lastName" + name="lastName" + onChange={[Function]} + required={true} + type="text" + value="" + /> + <div + className="title text-22-bold" + > + auth.enedis-sge-grandlyon.pdlTitle + </div> + <label + className="text-16-normal" + htmlFor="pdl" + > + auth.enedis-sge-grandlyon.pdlLabel + </label> + <input + id="pdl" + inputMode="numeric" + min={0} + name="pdl" + onChange={[Function]} + required={true} + type="number" + /> + <div + className="pdl-hint text-16-normal" + onClick={[Function]} + > + auth.enedis-sge-grandlyon.pdlHint + </div> + <SgeModalHint + handleCloseClick={[Function]} + open={false} + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={false} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={false} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={true} + onClose={[Function]} + open={false} + /> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </SgeModalHint> + </div> + </StepIdentityAndPdl> + <FormNavigation + disableNextButton={true} + handleNext={[Function]} + handlePrevious={[Function]} + isEcogesture={false} + isLastConnectStep={false} + step={0} + > + <div + className="profile-navigation" + > + <WithStyles(ForwardRef(Button)) + aria-label="profile_type.accessibility.button_previous" + className="profile-navigation-button" + classes={ + Object { + "label": "text-16-normal", + "root": "btn-profile-back", + } + } + disabled={true} + onClick={[Function]} + > + <ForwardRef(Button) + aria-label="profile_type.accessibility.button_previous" + className="profile-navigation-button" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-normal", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-profile-back", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + disabled={true} + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="profile_type.accessibility.button_previous" + className="MuiButton-root btn-profile-back MuiButton-text profile-navigation-button Mui-disabled" + component="button" + disabled={true} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="profile_type.accessibility.button_previous" + className="MuiButton-root btn-profile-back MuiButton-text profile-navigation-button Mui-disabled" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={true} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <button + aria-label="profile_type.accessibility.button_previous" + className="MuiButtonBase-root MuiButton-root btn-profile-back MuiButton-text profile-navigation-button Mui-disabled Mui-disabled" + disabled={true} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={-1} + type="button" + > + <span + className="MuiButton-label text-16-normal" + > + < profile_type.form.button_previous + </span> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + <WithStyles(ForwardRef(Button)) + aria-label="profile_type.accessibility.button_next" + className="profile-navigation-button disabled" + classes={ + Object { + "label": "text-16-normal", + "root": "btn-profile-next rounded", + } + } + disabled={true} + onClick={[Function]} + > + <ForwardRef(Button) + aria-label="profile_type.accessibility.button_next" + className="profile-navigation-button disabled" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-normal", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-profile-next rounded", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + disabled={true} + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="profile_type.accessibility.button_next" + className="MuiButton-root btn-profile-next rounded MuiButton-text profile-navigation-button disabled Mui-disabled" + component="button" + disabled={true} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="profile_type.accessibility.button_next" + className="MuiButton-root btn-profile-next rounded MuiButton-text profile-navigation-button disabled Mui-disabled" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={true} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <button + aria-label="profile_type.accessibility.button_next" + className="MuiButtonBase-root MuiButton-root btn-profile-next rounded MuiButton-text profile-navigation-button disabled Mui-disabled Mui-disabled" + disabled={true} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={-1} + type="button" + > + <span + className="MuiButton-label text-16-normal" + > + profile_type.form.button_next > + </span> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </FormNavigation> + </div> + </mock-content> + </SgeConnectView> +</Provider> +`; diff --git a/src/components/Connection/SGEConnect/__snapshots__/SgeInit.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/SgeInit.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..0d99d65786b86084707cb9581e5e5c31393a774d --- /dev/null +++ b/src/components/Connection/SGEConnect/__snapshots__/SgeInit.spec.tsx.snap @@ -0,0 +1,223 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`SgeInit component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <SgeInit + fluidStatus={ + Object { + "connection": Object { + "account": null, + "isUpdating": false, + "konnector": null, + "konnectorConfig": Object { + "activation": "", + "name": "", + "oauth": false, + "siteLink": "", + "slug": "enedis-sge-grandlyon", + }, + "shouldLaunchKonnector": false, + "trigger": null, + "triggerState": null, + }, + "firstDataDate": "2019-09-01T00:00:00.000Z", + "fluidType": 0, + "lastDataDate": "2020-09-01T00:00:00.000Z", + "status": 0, + } + } + > + <div + className="kloginform sge-connect" + > + <p + className="kloginform-title enedis-sge-grandlyon text-20-bold" + > + auth.enedis-sge-grandlyon.title + </p> + <StyledIcon + icon="test-file-stub" + size={180} + > + <Icon + aria-hidden={true} + icon="test-file-stub" + size={180} + spin={false} + > + <Component + aria-hidden={true} + className="styles__icon___23x3R" + height={180} + style={Object {}} + width={180} + > + <svg + aria-hidden={true} + className="styles__icon___23x3R" + height={180} + style={Object {}} + width={180} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </StyledIcon> + <p + className="sge-subtitle enedis-sge-grandlyon text-16-regular" + > + auth.enedis-sge-grandlyon.bill + </p> + <div + className="kloginform-button" + > + <WithStyles(ForwardRef(Button)) + aria-label="auth.enedis-sge-grandlyon.accessibility.connect" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-highlight", + } + } + onClick={[Function]} + > + <ForwardRef(Button) + aria-label="auth.enedis-sge-grandlyon.accessibility.connect" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="auth.enedis-sge-grandlyon.accessibility.connect" + className="MuiButton-root btn-highlight MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="auth.enedis-sge-grandlyon.accessibility.connect" + className="MuiButton-root btn-highlight MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <button + aria-label="auth.enedis-sge-grandlyon.accessibility.connect" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + auth.enedis-sge-grandlyon.connect + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </div> + </SgeInit> +</Provider> +`; diff --git a/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..322986326ee5c10286b79c6e0cd73606677f9067 --- /dev/null +++ b/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap @@ -0,0 +1,1027 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`SgeModalHint component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <SgeModalHint + handleCloseClick={[MockFunction]} + open={true} + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + disableEscapeKeyDown={true} + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + disableEscapeKeyDown={true} + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={true} + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Portal) + disablePortal={false} + > + <Portal + containerInfo={ + <body + style="padding-right: 0px; overflow: hidden;" + > + <div + class="MuiDialog-root modal-root" + role="presentation" + style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;" + > + <div + aria-hidden="true" + class="MuiBackdrop-root" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + /> + <div + data-test="sentinelStart" + tabindex="0" + /> + <div + class="MuiDialog-container MuiDialog-scrollPaper" + role="none presentation" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + tabindex="-1" + > + <div + aria-labelledby="accessibility-title" + class="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + challenge_no_fluid_modal.accessibility.window_title + </div> + <button + aria-label="feedback.accessibility.button_close" + class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + tabindex="0" + type="button" + > + <span + class="MuiIconButton-label" + > + <svg + class="styles__icon___23x3R" + height="16" + width="16" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + <div + class="sgeHintModal" + > + <div + class="title text-20-bold" + > + auth.enedis-sge-grandlyon.modalHint.title + </div> + <svg + class="styles__icon___23x3R" + height="385" + width="240" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + <button + aria-label="auth.enedis-sge-grandlyon.modalHint.button-accessibility" + class="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + style="height: 40px;" + tabindex="0" + type="button" + > + <span + class="MuiButton-label text-16-bold" + > + auth.enedis-sge-grandlyon.modalHint.button + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + </div> + </div> + </div> + <div + data-test="sentinelEnd" + tabindex="0" + /> + </div> + </body> + } + > + <div + className="MuiDialog-root modal-root" + onKeyDown={[Function]} + role="presentation" + style={ + Object { + "bottom": 0, + "left": 0, + "position": "fixed", + "right": 0, + "top": 0, + "zIndex": 1300, + } + } + > + <WithStyles(ForwardRef(Backdrop)) + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Backdrop) + classes={ + Object { + "invisible": "MuiBackdrop-invisible", + "root": "MuiBackdrop-root", + } + } + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Fade) + in={true} + onClick={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onClick={[Function]} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + aria-hidden={true} + className="MuiBackdrop-root" + onClick={[Function]} + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + /> + </Transition> + </ForwardRef(Fade)> + </ForwardRef(Backdrop)> + </WithStyles(ForwardRef(Backdrop))> + <Unstable_TrapFocus + disableAutoFocus={false} + disableEnforceFocus={false} + disableRestoreFocus={false} + getDoc={[Function]} + isEnabled={[Function]} + open={true} + > + <div + data-test="sentinelStart" + tabIndex={0} + /> + <ForwardRef(Fade) + appear={true} + in={true} + onEnter={[Function]} + onExited={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + className="MuiDialog-container MuiDialog-scrollPaper" + onMouseDown={[Function]} + onMouseUp={[Function]} + role="none presentation" + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + tabIndex="-1" + > + <WithStyles(ForwardRef(Paper)) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + elevation={24} + role="dialog" + > + <ForwardRef(Paper) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + classes={ + Object { + "elevation0": "MuiPaper-elevation0", + "elevation1": "MuiPaper-elevation1", + "elevation10": "MuiPaper-elevation10", + "elevation11": "MuiPaper-elevation11", + "elevation12": "MuiPaper-elevation12", + "elevation13": "MuiPaper-elevation13", + "elevation14": "MuiPaper-elevation14", + "elevation15": "MuiPaper-elevation15", + "elevation16": "MuiPaper-elevation16", + "elevation17": "MuiPaper-elevation17", + "elevation18": "MuiPaper-elevation18", + "elevation19": "MuiPaper-elevation19", + "elevation2": "MuiPaper-elevation2", + "elevation20": "MuiPaper-elevation20", + "elevation21": "MuiPaper-elevation21", + "elevation22": "MuiPaper-elevation22", + "elevation23": "MuiPaper-elevation23", + "elevation24": "MuiPaper-elevation24", + "elevation3": "MuiPaper-elevation3", + "elevation4": "MuiPaper-elevation4", + "elevation5": "MuiPaper-elevation5", + "elevation6": "MuiPaper-elevation6", + "elevation7": "MuiPaper-elevation7", + "elevation8": "MuiPaper-elevation8", + "elevation9": "MuiPaper-elevation9", + "outlined": "MuiPaper-outlined", + "root": "MuiPaper-root", + "rounded": "MuiPaper-rounded", + } + } + elevation={24} + role="dialog" + > + <div + aria-labelledby="accessibility-title" + className="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + challenge_no_fluid_modal.accessibility.window_title + </div> + <WithStyles(ForwardRef(IconButton)) + aria-label="feedback.accessibility.button_close" + className="modal-paper-close-button" + onClick={[MockFunction]} + > + <ForwardRef(IconButton) + aria-label="feedback.accessibility.button_close" + className="modal-paper-close-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="feedback.accessibility.button_close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <ForwardRef(ButtonBase) + aria-label="feedback.accessibility.button_close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <button + aria-label="feedback.accessibility.button_close" + className="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <Icon + icon="test-file-stub" + size={16} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <svg + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + <div + className="sgeHintModal" + > + <div + className="title text-20-bold" + > + auth.enedis-sge-grandlyon.modalHint.title + </div> + <Icon + height={385} + icon="test-file-stub" + spin={false} + width={240} + > + <Component + className="styles__icon___23x3R" + height={385} + style={Object {}} + width={240} + > + <svg + className="styles__icon___23x3R" + height={385} + style={Object {}} + width={240} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + <WithStyles(ForwardRef(Button)) + aria-label="auth.enedis-sge-grandlyon.modalHint.button-accessibility" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-highlight", + } + } + onClick={[MockFunction]} + style={ + Object { + "height": "40px", + } + } + > + <ForwardRef(Button) + aria-label="auth.enedis-sge-grandlyon.modalHint.button-accessibility" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[MockFunction]} + style={ + Object { + "height": "40px", + } + } + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="auth.enedis-sge-grandlyon.modalHint.button-accessibility" + className="MuiButton-root btn-highlight MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + style={ + Object { + "height": "40px", + } + } + type="button" + > + <ForwardRef(ButtonBase) + aria-label="auth.enedis-sge-grandlyon.modalHint.button-accessibility" + className="MuiButton-root btn-highlight MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + style={ + Object { + "height": "40px", + } + } + type="button" + > + <button + aria-label="auth.enedis-sge-grandlyon.modalHint.button-accessibility" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + style={ + Object { + "height": "40px", + } + } + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + auth.enedis-sge-grandlyon.modalHint.button + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </div> + </ForwardRef(Paper)> + </WithStyles(ForwardRef(Paper))> + </div> + </Transition> + </ForwardRef(Fade)> + <div + data-test="sentinelEnd" + tabIndex={0} + /> + </Unstable_TrapFocus> + </div> + </Portal> + </ForwardRef(Portal)> + </ForwardRef(Modal)> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </SgeModalHint> +</Provider> +`; diff --git a/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..3414e107bd883a271544835f8f9e3b8394fde859 --- /dev/null +++ b/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap @@ -0,0 +1,83 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`StepAddress component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <StepAddress + onChange={[MockFunction]} + sgeState={ + Object { + "address": "", + "city": "", + "currentStep": 0, + "dataConsent": false, + "firstName": "", + "lastName": "", + "pdl": null, + "pdlConfirm": false, + "shouldLaunchAccount": false, + "zipCode": null, + } + } + > + <div + className="sge-step-container stepAddress" + > + <div + className="title text-22-bold" + > + auth.enedis-sge-grandlyon.addressTitle + </div> + <label + className="text-16-normal" + htmlFor="address" + > + auth.enedis-sge-grandlyon.address + </label> + <input + id="address" + name="address" + onChange={[Function]} + type="text" + value="" + /> + <label + className="text-16-normal" + htmlFor="zipCode" + > + auth.enedis-sge-grandlyon.zipCode + </label> + <input + id="zipCode" + min={0} + name="zipCode" + onChange={[Function]} + type="number" + /> + <label + className="text-16-normal" + htmlFor="city" + > + auth.enedis-sge-grandlyon.city + </label> + <input + id="city" + name="city" + onChange={[Function]} + type="text" + value="" + /> + </div> + </StepAddress> +</Provider> +`; diff --git a/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..87b0a995e47e4a216dd64121cb2f595a02117a14 --- /dev/null +++ b/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap @@ -0,0 +1,92 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`StepConsent component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <StepConsent + onChange={[MockFunction]} + sgeState={ + Object { + "address": "", + "city": "", + "currentStep": 0, + "dataConsent": false, + "firstName": "", + "lastName": "", + "pdl": null, + "pdlConfirm": false, + "shouldLaunchAccount": false, + "zipCode": null, + } + } + > + <div + className="sge-step-container stepConsent" + > + <div + className="head text-16-normal" + > + auth.enedis-sge-grandlyon.headConsent + </div> + <div + className="title text-22-bold" + > + auth.enedis-sge-grandlyon.textConsent + </div> + <ul + className="text-16-normal" + > + <li> + auth.enedis-sge-grandlyon.consentLi1 + </li> + <li> + auth.enedis-sge-grandlyon.consentLi2 + </li> + <li> + auth.enedis-sge-grandlyon.consentLi3 + </li> + <li> + auth.enedis-sge-grandlyon.consentLi4 + </li> + </ul> + <hr /> + <label + className="checkbox" + > + <input + checked={false} + id="dataConsent" + name="Data-consent-validation" + onChange={[Function]} + type="checkbox" + /> + <span> + auth.enedis-sge-grandlyon.consentCheck1 + </span> + </label> + <label + className="checkbox" + > + <input + checked={false} + id="pdlConfirm" + name="Data-consent-validation" + onChange={[Function]} + type="checkbox" + /> + auth.enedis-sge-grandlyon.consentCheck2 + </label> + </div> + </StepConsent> +</Provider> +`; diff --git a/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..6b069ff7f702427d9ad77b0a345bdc6560a63fd5 --- /dev/null +++ b/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap @@ -0,0 +1,472 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`StepIdentityAndPdl component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <StepIdentityAndPdl + onChange={[MockFunction]} + sgeState={ + Object { + "address": "", + "city": "", + "currentStep": 0, + "dataConsent": false, + "firstName": "", + "lastName": "", + "pdl": null, + "pdlConfirm": false, + "shouldLaunchAccount": false, + "zipCode": null, + } + } + > + <div + className="sge-step-container stepIdentity" + > + <div + className="title text-22-bold" + > + auth.enedis-sge-grandlyon.identityTitle + </div> + <label + className="text-16-normal" + htmlFor="firstName" + > + auth.enedis-sge-grandlyon.firstName + </label> + <input + id="firstName" + name="firstName" + onChange={[Function]} + required={true} + type="text" + value="" + /> + <label + className="text-16-normal" + htmlFor="lastName" + > + auth.enedis-sge-grandlyon.lastName + </label> + <input + id="lastName" + name="lastName" + onChange={[Function]} + required={true} + type="text" + value="" + /> + <div + className="title text-22-bold" + > + auth.enedis-sge-grandlyon.pdlTitle + </div> + <label + className="text-16-normal" + htmlFor="pdl" + > + auth.enedis-sge-grandlyon.pdlLabel + </label> + <input + id="pdl" + inputMode="numeric" + min={0} + name="pdl" + onChange={[Function]} + required={true} + type="number" + /> + <div + className="pdl-hint text-16-normal" + onClick={[Function]} + > + auth.enedis-sge-grandlyon.pdlHint + </div> + <SgeModalHint + handleCloseClick={[Function]} + open={false} + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={false} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={false} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={true} + onClose={[Function]} + open={false} + /> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </SgeModalHint> + </div> + </StepIdentityAndPdl> +</Provider> +`; diff --git a/src/components/Connection/__snapshots__/Connection.spec.tsx.snap b/src/components/Connection/__snapshots__/Connection.spec.tsx.snap index 990ba1c0eea23080bf48922657c3ce3bba03515a..080b18b8e1cacca0d5fc4f4417638d0594c694ba 100644 --- a/src/components/Connection/__snapshots__/Connection.spec.tsx.snap +++ b/src/components/Connection/__snapshots__/Connection.spec.tsx.snap @@ -1,127 +1,329 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Connection component test should call ConnectionLogin 1`] = ` -<Connection - fluidStatus={ +<Provider + store={ Object { - "connection": Object { - "account": null, - "isUpdating": false, - "konnector": null, - "konnectorConfig": Object { - "activation": "", - "name": "", - "oauth": false, - "siteLink": "", - "slug": "", - }, - "shouldLaunchKonnector": false, - "trigger": null, - "triggerState": null, - }, - "firstDataDate": "2019-09-01T00:00:00.000Z", - "fluidType": 0, - "lastDataDate": "2020-09-01T00:00:00.000Z", - "status": 200, + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], } } > - <div - className="konnector-form" - > - <mockConstructor - fluidStatus={ - Object { - "connection": Object { - "account": null, - "isUpdating": false, - "konnector": null, - "konnectorConfig": Object { - "activation": "", - "name": "", - "oauth": false, - "siteLink": "", - "slug": "", - }, - "shouldLaunchKonnector": false, - "trigger": null, - "triggerState": null, + <Connection + fluidStatus={ + Object { + "connection": Object { + "account": null, + "isUpdating": false, + "konnector": null, + "konnectorConfig": Object { + "activation": "", + "name": "", + "oauth": false, + "siteLink": "", + "slug": "enedis-sge-grandlyon", }, - "firstDataDate": "2019-09-01T00:00:00.000Z", - "fluidType": 0, - "lastDataDate": "2020-09-01T00:00:00.000Z", - "status": 200, - } + "shouldLaunchKonnector": false, + "trigger": null, + "triggerState": null, + }, + "firstDataDate": "2019-09-01T00:00:00.000Z", + "fluidType": 0, + "lastDataDate": "2020-09-01T00:00:00.000Z", + "status": 200, } - onSuccess={[Function]} + } + > + <div + className="konnector-form" > - <div - id="ConnectionLogin" - /> - </mockConstructor> - </div> -</Connection> + <SgeInit + fluidStatus={ + Object { + "connection": Object { + "account": null, + "isUpdating": false, + "konnector": null, + "konnectorConfig": Object { + "activation": "", + "name": "", + "oauth": false, + "siteLink": "", + "slug": "enedis-sge-grandlyon", + }, + "shouldLaunchKonnector": false, + "trigger": null, + "triggerState": null, + }, + "firstDataDate": "2019-09-01T00:00:00.000Z", + "fluidType": 0, + "lastDataDate": "2020-09-01T00:00:00.000Z", + "status": 200, + } + } + > + <div + className="kloginform sge-connect" + > + <p + className="kloginform-title enedis-sge-grandlyon text-20-bold" + > + auth.enedis-sge-grandlyon.title + </p> + <StyledIcon + icon="test-file-stub" + size={180} + > + <Icon + aria-hidden={true} + icon="test-file-stub" + size={180} + spin={false} + > + <Component + aria-hidden={true} + className="styles__icon___23x3R" + height={180} + style={Object {}} + width={180} + > + <svg + aria-hidden={true} + className="styles__icon___23x3R" + height={180} + style={Object {}} + width={180} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </StyledIcon> + <p + className="sge-subtitle enedis-sge-grandlyon text-16-regular" + > + auth.enedis-sge-grandlyon.bill + </p> + <div + className="kloginform-button" + > + <WithStyles(ForwardRef(Button)) + aria-label="auth.enedis-sge-grandlyon.accessibility.connect" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-highlight", + } + } + onClick={[Function]} + > + <ForwardRef(Button) + aria-label="auth.enedis-sge-grandlyon.accessibility.connect" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="auth.enedis-sge-grandlyon.accessibility.connect" + className="MuiButton-root btn-highlight MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="auth.enedis-sge-grandlyon.accessibility.connect" + className="MuiButton-root btn-highlight MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <button + aria-label="auth.enedis-sge-grandlyon.accessibility.connect" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + auth.enedis-sge-grandlyon.connect + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </div> + </SgeInit> + </div> + </Connection> +</Provider> `; exports[`Connection component test should call ConnectionOAuth 1`] = ` -<Connection - fluidStatus={ +<Provider + store={ Object { - "connection": Object { - "account": null, - "isUpdating": false, - "konnector": null, - "konnectorConfig": Object { - "activation": "", - "name": "", - "oauth": true, - "siteLink": "", - "slug": "", - }, - "shouldLaunchKonnector": false, - "trigger": null, - "triggerState": null, - }, - "firstDataDate": "2019-09-01T00:00:00.000Z", - "fluidType": 2, - "lastDataDate": "2020-09-01T00:00:00.000Z", - "status": 200, + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], } } > - <div - className="konnector-form" - > - <mockConstructor - fluidStatus={ - Object { - "connection": Object { - "account": null, - "isUpdating": false, - "konnector": null, - "konnectorConfig": Object { - "activation": "", - "name": "", - "oauth": true, - "siteLink": "", - "slug": "", - }, - "shouldLaunchKonnector": false, - "trigger": null, - "triggerState": null, + <Connection + fluidStatus={ + Object { + "connection": Object { + "account": null, + "isUpdating": false, + "konnector": null, + "konnectorConfig": Object { + "activation": "", + "name": "", + "oauth": true, + "siteLink": "", + "slug": "grdfgrandlyon", }, - "firstDataDate": "2019-09-01T00:00:00.000Z", - "fluidType": 2, - "lastDataDate": "2020-09-01T00:00:00.000Z", - "status": 200, - } + "shouldLaunchKonnector": false, + "trigger": null, + "triggerState": null, + }, + "firstDataDate": "2019-09-01T00:00:00.000Z", + "fluidType": 2, + "lastDataDate": "2020-09-01T00:00:00.000Z", + "status": 200, } - onSuccess={[Function]} + } + > + <div + className="konnector-form" > - <div - id="ConnectionOAuth" - /> - </mockConstructor> - </div> -</Connection> + <mockConstructor + fluidStatus={ + Object { + "connection": Object { + "account": null, + "isUpdating": false, + "konnector": null, + "konnectorConfig": Object { + "activation": "", + "name": "", + "oauth": true, + "siteLink": "", + "slug": "grdfgrandlyon", + }, + "shouldLaunchKonnector": false, + "trigger": null, + "triggerState": null, + }, + "firstDataDate": "2019-09-01T00:00:00.000Z", + "fluidType": 2, + "lastDataDate": "2020-09-01T00:00:00.000Z", + "status": 200, + } + } + onSuccess={[Function]} + > + <div + id="ConnectionOAuth" + /> + </mockConstructor> + </div> + </Connection> +</Provider> `; diff --git a/src/components/Connection/connectionLogin.scss b/src/components/Connection/connectionLogin.scss index 9460217f553e72c77da5f388102c5336160b2b4f..7f7b8d508ba6cddaca6b97859483d1e4cd47cb8a 100644 --- a/src/components/Connection/connectionLogin.scss +++ b/src/components/Connection/connectionLogin.scss @@ -1,11 +1,14 @@ @import 'src/styles/base/color'; .kloginform { + &.sge-connect { + text-align: center; + } .kloginform-title { text-align: center; margin-bottom: 0; padding: 0 1rem; - &.enedisgrandlyon { + &.enedis-sge-grandlyon { color: $elec-color; } &.grdfgrandlyon { @@ -20,6 +23,15 @@ color: $white; margin: 2.5rem 0 0.5rem; } + + .sge-subtitle { + color: $white; + text-align: center; + span { + font-weight: bold; + color: $gold-shadow; + } + } .kloginform-infotext { text-align: center; color: $grey-bright; diff --git a/src/components/EcogestureForm/EcogestureFormEquipment.tsx b/src/components/EcogestureForm/EcogestureFormEquipment.tsx index 8f0524dbd29ef957a45f40723e1ccb4903861424..cd3fc09d24825af786ef22bb48ec32c6d4a340e4 100644 --- a/src/components/EcogestureForm/EcogestureFormEquipment.tsx +++ b/src/components/EcogestureForm/EcogestureFormEquipment.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { EcogestureStepForm } from 'enum/ecogestureForm.enum' import { ProfileEcogesture } from 'models/profileEcogesture.model' import { EquipmentType } from 'enum/ecogesture.enum' diff --git a/src/components/EcogestureForm/EcogestureFormSingleChoice.tsx b/src/components/EcogestureForm/EcogestureFormSingleChoice.tsx index 7fa2f94474fc34ced9ad17b5605e9a120fe16f28..eab64499cd3bfdfcd56ac1e0e131613a806478bb 100644 --- a/src/components/EcogestureForm/EcogestureFormSingleChoice.tsx +++ b/src/components/EcogestureForm/EcogestureFormSingleChoice.tsx @@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import classNames from 'classnames' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { EcogestureStepForm } from 'enum/ecogestureForm.enum' import { ProfileEcogesture, diff --git a/src/components/ProfileType/FormNavigation.spec.tsx b/src/components/FormGlobal/FormNavigation.spec.tsx similarity index 95% rename from src/components/ProfileType/FormNavigation.spec.tsx rename to src/components/FormGlobal/FormNavigation.spec.tsx index fbb34ae60ebc1375821ed973657ef5e71d22a3d0..a3357ea6784be7623a981443eef48f06e4ece0f2 100644 --- a/src/components/ProfileType/FormNavigation.spec.tsx +++ b/src/components/FormGlobal/FormNavigation.spec.tsx @@ -20,7 +20,6 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }) describe('FormNavigation component', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any let store: any beforeEach(() => { store = createMockStore(mockInitialEcolyoState) diff --git a/src/components/ProfileType/FormNavigation.tsx b/src/components/FormGlobal/FormNavigation.tsx similarity index 80% rename from src/components/ProfileType/FormNavigation.tsx rename to src/components/FormGlobal/FormNavigation.tsx index 07e9097a1c8adbb85c42d8ea0b8d9c3a2afc4b02..62dc25ad9e7f7473ffaeb76e84817d1a3aed42de 100644 --- a/src/components/ProfileType/FormNavigation.tsx +++ b/src/components/FormGlobal/FormNavigation.tsx @@ -1,17 +1,20 @@ import React from 'react' -import 'components/ProfileType/formNavigation.scss' +import 'components/FormGlobal/formNavigation.scss' import classNames from 'classnames' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Button from '@material-ui/core/Button' import { ProfileTypeStepForm } from 'enum/profileType.enum' import { EcogestureStepForm } from 'enum/ecogestureForm.enum' +import { SgeStep } from 'enum/sgeStep.enum' +import { useHistory } from 'react-router-dom' interface FormNavigationProps { - step: ProfileTypeStepForm | EcogestureStepForm + step: ProfileTypeStepForm | EcogestureStepForm | SgeStep handlePrevious: Function handleNext: Function disableNextButton: boolean isEcogesture?: boolean + isLastConnectStep?: boolean } const FormNavigation: React.FC<FormNavigationProps> = ({ @@ -20,14 +23,19 @@ const FormNavigation: React.FC<FormNavigationProps> = ({ handleNext, disableNextButton, isEcogesture, + isLastConnectStep, }: FormNavigationProps) => { const { t } = useI18n() - + const history = useHistory() const handlePreviousClick = () => { handlePrevious() } const handleNextClick = () => { handleNext() + //handle go back to connect for SGE + if (isLastConnectStep) { + history.push('/consumption/electricity') + } } return ( @@ -62,6 +70,7 @@ const FormNavigation: React.FC<FormNavigationProps> = ({ }} > {step === ProfileTypeStepForm.UPDATE_DATE || + isLastConnectStep || (step === EcogestureStepForm.EQUIPMENTS && isEcogesture) ? t('profile_type.form.button_end') : `${t('profile_type.form.button_next')} >`} diff --git a/src/components/ProfileType/ProfileTypeProgress.tsx b/src/components/FormGlobal/FormProgress.tsx similarity index 57% rename from src/components/ProfileType/ProfileTypeProgress.tsx rename to src/components/FormGlobal/FormProgress.tsx index 561c12159101e58157d4685450ad58778bfe77e3..77c7f732f4a02adc8e90678d12215b2e6f32f15a 100644 --- a/src/components/ProfileType/ProfileTypeProgress.tsx +++ b/src/components/FormGlobal/FormProgress.tsx @@ -1,16 +1,21 @@ import React from 'react' -import 'components/ProfileType/profileTypeProgress.scss' +import 'components/FormGlobal/formProgress.scss' import { ProfileTypeStepForm } from 'enum/profileType.enum' +import { SgeStep } from 'enum/sgeStep.enum' -interface ProfileTypeProgressProps { - step: ProfileTypeStepForm +interface FormProgressProps { + step: ProfileTypeStepForm | SgeStep + formType: 'sge' | 'profile' } -const ProfileTypeProgress: React.FC<ProfileTypeProgressProps> = ({ +const FormProgress: React.FC<FormProgressProps> = ({ step, -}: ProfileTypeProgressProps) => { + formType, +}: FormProgressProps) => { const getProgress = () => { - const total: number = Object.values(ProfileTypeStepForm).length / 2 + const total: number = + Object.values(formType === 'sge' ? SgeStep : ProfileTypeStepForm).length / + 2 const progress: number = Math.round((step / total) * 100) return progress } @@ -27,4 +32,4 @@ const ProfileTypeProgress: React.FC<ProfileTypeProgressProps> = ({ ) } -export default ProfileTypeProgress +export default FormProgress diff --git a/src/components/ProfileType/formNavigation.scss b/src/components/FormGlobal/formNavigation.scss similarity index 98% rename from src/components/ProfileType/formNavigation.scss rename to src/components/FormGlobal/formNavigation.scss index b3baeff5f57b2701a689aa1601dd4db2089a1a32..4ed172750c30ded9c551d1966535cc19ea7894c2 100644 --- a/src/components/ProfileType/formNavigation.scss +++ b/src/components/FormGlobal/formNavigation.scss @@ -12,6 +12,7 @@ justify-content: center; align-items: flex-start; padding: 0 0 env(safe-area-inset-bottom) 0; + left: 0; @media (min-width: $width-tablet) { background: $dark-light-2; height: 3rem; diff --git a/src/components/ProfileType/profileTypeProgress.scss b/src/components/FormGlobal/formProgress.scss similarity index 100% rename from src/components/ProfileType/profileTypeProgress.scss rename to src/components/FormGlobal/formProgress.scss diff --git a/src/components/Header/header.scss b/src/components/Header/header.scss index 325ab08bd8fd1171b56dc7dc20bbfb2fef5bb917..4cfbd9ed7448d121cc44202e0a4c239a305a980c 100644 --- a/src/components/Header/header.scss +++ b/src/components/Header/header.scss @@ -17,9 +17,9 @@ } .header-top { background: radial-gradient( - 74.83% 76.97% at 50% 13.64%, - #343641 0%, - #1b1c22 100% + circle, + rgba(52, 54, 65, 1) 0%, + rgba(27, 28, 34, 1) 100% ); width: 100%; .header-text { diff --git a/src/components/Hooks/useKonnectorAuth.tsx b/src/components/Hooks/useKonnectorAuth.tsx new file mode 100644 index 0000000000000000000000000000000000000000..96e568bf0435674cfe3f51c993602f1f270a7adb --- /dev/null +++ b/src/components/Hooks/useKonnectorAuth.tsx @@ -0,0 +1,124 @@ +import { useState, useCallback } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { Client, useClient } from 'cozy-client' +import { + AccountAuthData, + AccountSgeData, + FluidConnection, + FluidStatus, + UsageEvent, +} from 'models' +import { AppStore } from 'store' +import { UsageEventType } from 'enum/usageEvent.enum' +import AccountService from 'services/account.service' +import UsageEventService from 'services/usageEvent.service' +import { updatedFluidConnection } from 'store/global/global.actions' +import ConnectionService from 'services/connection.service' +import { setLoading } from 'store/chart/chart.actions' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { FluidSlugType } from 'enum/fluidSlug.enum' + +const useKonnectorAuth = ( + fluidStatus: FluidStatus, + login?: string, + password?: string +): [() => Promise<null | undefined>, () => Promise<void>, string] => { + const client: Client = useClient() + const { t } = useI18n() + const dispatch = useDispatch() + const konnectorSlug: FluidSlugType = + fluidStatus.connection.konnectorConfig.slug + const { sgeConnect } = useSelector((state: AppStore) => state.ecolyo.global) + + const [connectError, setError] = useState<string>('') + + const onSuccess = useCallback(async () => { + const updatedConnection: FluidConnection = { + ...fluidStatus.connection, + shouldLaunchKonnector: true, + } + dispatch(updatedFluidConnection(fluidStatus.fluidType, updatedConnection)) + }, [dispatch, fluidStatus.fluidType, fluidStatus.connection]) + + const sendUsageEventError = async (slug: string): Promise<UsageEvent> => { + return UsageEventService.addEvent(client, { + type: UsageEventType.KONNECTOR_CONNECT_EVENT, + target: slug, + result: 'error', + }) + } + + const connect = async () => { + const connectionService = new ConnectionService(client) + try { + // If first connexion, send the usage event + await UsageEventService.addEvent(client, { + type: UsageEventType.KONNECTOR_ATTEMPT_EVENT, + target: konnectorSlug, + result: 'error', + }) + const { account: _account, trigger: _trigger } = + konnectorSlug === FluidSlugType.WATER + ? await connectionService.connectNewUser(konnectorSlug, { + login: login ? login : '', + password: password, + }) + : await connectionService.connectNewUser( + konnectorSlug, + undefined, + sgeConnect + ) + if (!_trigger || !_account) { + setError(t('konnector_form.error_account_creation')) + sendUsageEventError(konnectorSlug) + return null + } + const updatedConnection: FluidConnection = { + ...fluidStatus.connection, + account: _account, + trigger: _trigger, + } + setLoading(false) + dispatch(updatedFluidConnection(fluidStatus.fluidType, updatedConnection)) + onSuccess() + } catch (err) { + setLoading(false) + sendUsageEventError(konnectorSlug) + console.log(err) + } + } + + const update = async () => { + if (fluidStatus.connection.account) { + const _account = fluidStatus.connection.account + let auth: AccountAuthData | AccountSgeData + if (konnectorSlug === FluidSlugType.WATER) { + auth = { + login: login, + password: password, + } as AccountAuthData + } else { + auth = { + pointId: sgeConnect.pdl ? sgeConnect.pdl.toString() : '', + firstname: sgeConnect.firstName, + lastname: sgeConnect.lastName, + address: sgeConnect.address, + postalCode: sgeConnect.zipCode ? sgeConnect.zipCode.toString() : '', + city: sgeConnect.city, + } as AccountSgeData + } + _account.auth = auth + const accountService = new AccountService(client) + const updatedAccount = await accountService.updateAccount(_account) + const updatedConnection: FluidConnection = { + ...fluidStatus.connection, + account: updatedAccount, + } + dispatch(updatedFluidConnection(fluidStatus.fluidType, updatedConnection)) + onSuccess() + } + } + return [connect, update, connectError] +} + +export default useKonnectorAuth diff --git a/src/components/Hooks/userInstanceSettings.tsx b/src/components/Hooks/userInstanceSettings.tsx index 34a0810aa55cc2dbf281c0f8eace00449f9abf10..4abb7bcf1d1d73f9c3f7549628f4cdebb3223f78 100644 --- a/src/components/Hooks/userInstanceSettings.tsx +++ b/src/components/Hooks/userInstanceSettings.tsx @@ -8,7 +8,6 @@ import { UserInstanceSettings, UserInstanceSettingsAttributes } from 'models' const userInstanceSettings = (): UserInstanceSettings => { const client = useClient() const [settings, setSettings] = useState<UserInstanceSettingsAttributes>({ - // eslint-disable-next-line @typescript-eslint/camelcase public_name: '', }) const [fetchStatus, setFetchStatus] = useState<string>('idle') diff --git a/src/components/Konnector/KonnectorModal.spec.tsx b/src/components/Konnector/KonnectorModal.spec.tsx index 5f0308da6a915afe3fb03041c4796d18691791f0..8610edb9ad736b070f86885526ed18f0604d220f 100644 --- a/src/components/Konnector/KonnectorModal.spec.tsx +++ b/src/components/Konnector/KonnectorModal.spec.tsx @@ -9,6 +9,9 @@ import { import KonnectorModal from './KonnectorModal' import { FluidType } from 'enum/fluid.enum' import { Button } from '@material-ui/core' +import toJson from 'enzyme-to-json' +import { KonnectorError } from 'enum/konnectorError.enum' +import { waitForComponentToPaint } from '../../../tests/__mocks__/testUtils' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -20,11 +23,11 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { } }) -describe('KonnectroModal component', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any +describe('KonnectorModal component', () => { let store: any beforeEach(() => { store = createMockStore(mockInitialEcolyoState) + jest.clearAllMocks() }) const mockHandleCloseClick = jest.fn() it('should be rendered correctly', () => { @@ -37,10 +40,13 @@ describe('KonnectroModal component', () => { error={null} fluidType={FluidType.ELECTRICITY} handleCloseClick={mockHandleCloseClick} + isLogging={false} + account={null} + handleAccountDeletion={jest.fn()} /> </Provider> - ).getElement() - expect(wrapper).toMatchSnapshot() + ) + expect(toJson(wrapper)).toMatchSnapshot() }) it('should be with updating text', () => { const wrapper = mount( @@ -52,10 +58,13 @@ describe('KonnectroModal component', () => { error={null} fluidType={FluidType.ELECTRICITY} handleCloseClick={mockHandleCloseClick} + isLogging={false} + account={null} + handleAccountDeletion={jest.fn()} /> </Provider> ) - expect(wrapper.find('.kmodal-waiting-text')).toBeTruthy() + expect(wrapper.find('.kmodal-waiting-text').exists()).toBeTruthy() }) it('should be correctly closed', async () => { const wrapper = mount( @@ -67,6 +76,9 @@ describe('KonnectroModal component', () => { error={null} fluidType={FluidType.ELECTRICITY} handleCloseClick={mockHandleCloseClick} + isLogging={false} + account={null} + handleAccountDeletion={jest.fn()} /> </Provider> ) @@ -80,13 +92,16 @@ describe('KonnectroModal component', () => { open={true} isUpdating={false} state={'error'} - error={'LOGIN_FAILED'} + error={KonnectorError.LOGIN_FAILED} fluidType={FluidType.ELECTRICITY} handleCloseClick={mockHandleCloseClick} + isLogging={false} + account={null} + handleAccountDeletion={jest.fn()} /> </Provider> ) - expect(wrapper.find('.kce-picto-txt')).toBeTruthy() + expect(wrapper.find('.kce-picto-txt').exists()).toBeTruthy() }) it('should render unknown error', async () => { const wrapper = mount( @@ -95,12 +110,34 @@ describe('KonnectroModal component', () => { open={true} isUpdating={false} state={'error'} - error={''} + error={null} fluidType={FluidType.ELECTRICITY} handleCloseClick={mockHandleCloseClick} + isLogging={false} + account={null} + handleAccountDeletion={jest.fn()} + /> + </Provider> + ) + expect(wrapper.find('.err-data-2').exists()).toBeTruthy() + }) + it('should render update error', async () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModal + open={true} + isUpdating={true} + state={null} + error={null} + fluidType={FluidType.WATER} + handleCloseClick={mockHandleCloseClick} + isLogging={false} + account={null} + handleAccountDeletion={jest.fn()} /> </Provider> ) - expect(wrapper.find('.err-data-2')).toBeTruthy() + await waitForComponentToPaint(wrapper) + expect(wrapper.find('.waiting-text').exists()).toBeTruthy() }) }) diff --git a/src/components/Konnector/KonnectorModal.tsx b/src/components/Konnector/KonnectorModal.tsx index d2c16a07e84868ec8a7feb89f975b601455de324..7ee3ebb18605d9b363ba94ac7138073d03af244f 100644 --- a/src/components/Konnector/KonnectorModal.tsx +++ b/src/components/Konnector/KonnectorModal.tsx @@ -1,25 +1,26 @@ -import React, { useEffect, useMemo, useState } from 'react' +import React, { useCallback, useEffect, useMemo, useState } from 'react' import './konnectorModal.scss' import classNames from 'classnames' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Lottie from 'react-lottie' import * as loadingData from 'assets/anims/bounceloading.json' - import { ERROR_EVENT, SUCCESS_EVENT, - LOGIN_SUCCESS_EVENT, } from 'cozy-harvest-lib/dist/models/flowEvents' import { FluidType } from 'enum/fluid.enum' import Icon from 'cozy-ui/transpiled/react/Icon' -import Button from '@material-ui/core/Button' import Dialog from '@material-ui/core/Dialog' import errorIcon from 'assets/icons/visu/data-nok.svg' +import EnedisIcon from 'assets/icons/ico/consent-outdated-enedis.svg' import successIcon from 'assets/icons/visu/data-ok.svg' import connectionWaitingText from 'constants/connectionWaitingText.json' import firstConnectionWaitingText from 'constants/firstConnectionWaitingText.json' import { shuffle } from 'lodash' +import { KonnectorError } from 'enum/konnectorError.enum' +import KonnectorModalFooter from './KonnectorModalFooter' +import { Account } from 'models' const loadingOptions = { loop: true, @@ -33,19 +34,25 @@ const loadingOptions = { interface KonnectorModalProps { open: boolean isUpdating: boolean + isLogging: boolean state: string | null - error: string | null + error: KonnectorError | null fluidType: FluidType handleCloseClick: (isSuccess?: boolean) => void + handleAccountDeletion: () => Promise<void> + account: Account | null } const KonnectorModal: React.FC<KonnectorModalProps> = ({ open, isUpdating, + isLogging, state, error, fluidType, handleCloseClick, + handleAccountDeletion, + account, }: KonnectorModalProps) => { const { t } = useI18n() const fluidName: string = FluidType[fluidType] @@ -61,6 +68,46 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({ ...shuffledWaitingTexts ) + const getUpdatingText = useCallback((): JSX.Element => { + return ( + <div className="kmodal-waiting-text text-18-italic"> + {shuffledWaitingTexts.map((text, idx) => ( + <div + key={idx} + className={classNames('waiting-text', { + ['show']: idx === index % shuffledWaitingTexts.length, + })} + > + <p>{text.first}</p> + <p>{text.second}</p> + </div> + ))} + </div> + ) + }, [index, shuffledWaitingTexts]) + + const getConnectionText = useCallback((): JSX.Element => { + return ( + <div className="kmodal-waiting-text text-18-italic"> + {isLogging ? ( + <p className="text-18-white">{t('konnector_modal.logging_txt')}</p> + ) : ( + firstConnectionWaitingTexts.map((text, idx) => ( + <div + key={idx} + className={classNames('waiting-text', { + ['show']: idx === index % firstConnectionWaitingTexts.length, + })} + > + <p>{text.first}</p> + <p>{text.second}</p> + </div> + )) + )} + </div> + ) + }, [firstConnectionWaitingTexts, index, isLogging, t]) + useEffect(() => { const interval = setInterval(() => { if (open && !state) { @@ -94,50 +141,25 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({ {open && !state ? ( <> <Lottie options={loadingOptions} height={50} width={50} speed={2} /> - <div className="kmodal-content-text kmodal-content-text-center text-16-normal"> - <div className="kc-wait text-16-bold"> - {t( - `konnector_modal.loading_data${isUpdating ? '_update' : ''}` - )} - </div> - </div> - {isUpdating ? ( - <div className="kmodal-waiting-text text-18-italic"> - {shuffledWaitingTexts.map((text, idx) => ( - <div - key={idx} - className={classNames('waiting-text', { - ['show']: idx === index % shuffledWaitingTexts.length, - })} - > - <p>{text.first}</p> - <p>{text.second}</p> - </div> - ))} - </div> - ) : ( - <div className="kmodal-waiting-text text-18-italic"> - {firstConnectionWaitingTexts.map((text, idx) => ( - <div - key={idx} - className={classNames('waiting-text', { - ['show']: - idx === index % firstConnectionWaitingTexts.length, - })} - > - <p>{text.first}</p> - <p>{text.second}</p> - </div> - ))} + {!isLogging && ( + <div className="kmodal-content-text kmodal-content-text-center text-16-normal"> + <div className="kc-wait text-16-bold"> + {t( + `konnector_modal.loading_data${isUpdating ? '_update' : ''}` + )} + </div> </div> )} + {isUpdating && getUpdatingText()} + {!isUpdating && getConnectionText()} </> ) : ( <> <div className="kmodal-info"> {state === ERROR_EVENT && ( <> - {error === 'LOGIN_FAILED' ? ( + {error === KonnectorError.LOGIN_FAILED && ( + //LOGIN FAILED FOR ENEDIS AND EGL <div className="konnector-config"> <Icon icon={errorIcon} size={48} /> <div className="kce-picto-txt text-20-bold"> @@ -150,28 +172,76 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({ }${fluidName.toLowerCase()}` )} </div> + {fluidType === FluidType.ELECTRICITY && !isUpdating && ( + <div className="elec-fail"> + {t( + `konnector_modal.error_credentials_${fluidName.toLowerCase()}_2` + )} + </div> + )} </div> - ) : ( - <div className="konnector-config"> - <Icon icon={errorIcon} size={48} /> - <div className="kce-picto-txt text-20-bold"> - {t('konnector_modal.error_txt')} + )} + {error === KonnectorError.USER_ACTION_NEEDED && + fluidType === FluidType.ELECTRICITY && ( + //INSEE CODE ERROR ENEDIS + <div className="konnector-config"> + <Icon icon={errorIcon} size={48} /> + <div className="kce-picto-txt text-20-bold"> + {t('konnector_modal.error_txt')} + </div> + <div className="text-20-bold"> + {t('konnector_modal.no_insee_code')} + </div> + <br /> + <div>{t(`konnector_modal.no_insee_code_txt`)}</div> </div> - <div> - {t( - `konnector_modal.error_data_${ - isUpdating ? 'update_' : '' - }${fluidName.toLowerCase()}` - )} + )} + {error === KonnectorError.TERMS_VERSION_MISMATCH && + isUpdating && + fluidType === FluidType.ELECTRICITY && ( + //MISMATCH UPDATE ERROR ENEDIS + <div className="kce-picto-txt konnector-config mismatch"> + <Icon icon={EnedisIcon} width={120} height={80} /> + <div className="title text-20-bold"> + {t('konnector_modal.mismatch.title')} + </div> + <div className="text-15-white"> + {t('konnector_modal.mismatch.text1')} + </div> + <div className="text-15-white"> + {t('konnector_modal.mismatch.text2')} + </div> + <div className="info text-15-normal"> + {t('konnector_modal.mismatch.text3')} + </div> </div> - <div className="err-data-2"> - {t('konnector_modal.error_data_2')} + )} + {error !== KonnectorError.USER_ACTION_NEEDED && + error !== KonnectorError.LOGIN_FAILED && + error !== KonnectorError.TERMS_VERSION_MISMATCH && ( + //DEFAULT CASE + <div className="konnector-config"> + {console.log('errortype', error)} + <Icon icon={errorIcon} size={48} /> + <div className="kce-picto-txt text-20-bold"> + {t('konnector_modal.error_txt')} + </div> + <div> + {t( + `konnector_modal.error_data_${ + isUpdating ? 'update_' : '' + }${fluidName.toLowerCase()}` + )} + </div> + <div className="err-data-2"> + {t('konnector_modal.error_data_2')} + </div> </div> - </div> - )} + )} </> )} {state === SUCCESS_EVENT && ( + //SUCCESS CASE <div className="konnector-config"> <Icon icon={successIcon} size={48} /> <div className="kcs-picto-txt text-20-bold"> @@ -184,18 +254,15 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({ )} </div> )} - {state !== LOGIN_SUCCESS_EVENT && ( - <Button - aria-label={t('konnector_modal.accessibility.button_close')} - onClick={() => handleCloseClick(state === SUCCESS_EVENT)} - classes={{ - root: 'btn-highlight', - label: 'text-16-bold', - }} - > - <div>{t('konnector_modal.button_validate')}</div> - </Button> - )} + <KonnectorModalFooter + state={state} + error={error} + fluidType={fluidType} + handleCloseClick={handleCloseClick} + handleAccountDeletion={handleAccountDeletion} + account={account} + isUpdating={isUpdating} + /> </div> </> )} diff --git a/src/components/Konnector/KonnectorModalFooter.spec.tsx b/src/components/Konnector/KonnectorModalFooter.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..53cb597641b9fba6a8500545a73a28420aee7031 --- /dev/null +++ b/src/components/Konnector/KonnectorModalFooter.spec.tsx @@ -0,0 +1,190 @@ +import React from 'react' +import { mount } from 'enzyme' +import { Provider } from 'react-redux' +import { + createMockStore, + mockInitialEcolyoState, +} from '../../../tests/__mocks__/store' +import { ERROR_EVENT } from 'cozy-harvest-lib/dist/models/flowEvents' +import toJson from 'enzyme-to-json' +import KonnectorModalFooter from './KonnectorModalFooter' +import { FluidType } from 'enum/fluid.enum' +import { KonnectorError } from 'enum/konnectorError.enum' +import { Button } from '@material-ui/core' +import { accountsData } from '../../../tests/__mocks__/accountsData.mock' +import { waitForComponentToPaint } from '../../../tests/__mocks__/testUtils' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +const mockHistoryPush = jest.fn() +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: () => ({ + push: mockHistoryPush, + }), +})) +const mockClose = jest.fn() +const mockDelete = jest.fn() +describe('KonnectorModalFooter component', () => { + let store: any + beforeEach(() => { + store = createMockStore(mockInitialEcolyoState) + mockDelete.mockClear() + mockClose.mockClear() + mockHistoryPush.mockClear() + }) + + it('should be rendered correctly', () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={null} + error={null} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={null} + isUpdating={false} + /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + + it('should render "understood" for enedis sge when postal code not supported (USER_ACTION_NEEDED)', () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.USER_ACTION_NEEDED} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={null} + isUpdating={false} + /> + </Provider> + ) + expect(wrapper.find(Button).text()).toBe( + 'konnector_modal.button_understood' + ) + }) + + it('should render "come back later" for enedis sge when address / name / pdl are not matching (LOGIN_FAILED)', () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.LOGIN_FAILED} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={null} + isUpdating={false} + /> + </Provider> + ) + expect(wrapper.find(Button).text()).toBe( + 'konnector_modal.button_come_back_later' + ) + }) + + it('should render "later" and "Verify infos" for enedis sge encountering an error on contract (TERMS_VERSION_MISMATCH)', () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.TERMS_VERSION_MISMATCH} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={null} + isUpdating={false} + /> + </Provider> + ) + expect(wrapper.find(Button).at(0).text()).toBe('Plus tard') + expect(wrapper.find(Button).at(1).text()).toBe('Vérifier les infos') + }) + + it('should close the modal', () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.LOGIN_FAILED} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={null} + isUpdating={false} + /> + </Provider> + ) + wrapper.find(Button).first().simulate('click') + expect(mockClose).toHaveBeenCalled() + }) + it('should go back to login', async () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.TERMS_VERSION_MISMATCH} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={accountsData[0]} + isUpdating={true} + /> + </Provider> + ) + wrapper.find(Button).at(1).simulate('click') + await waitForComponentToPaint(wrapper) + expect(mockDelete).toHaveBeenCalled() + expect(mockHistoryPush).toHaveBeenCalledTimes(1) + }) + it('should reset sge account and go back to login', async () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.TERMS_VERSION_MISMATCH} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={accountsData[0]} + isUpdating={true} + /> + </Provider> + ) + wrapper.find(Button).at(1).simulate('click') + await waitForComponentToPaint(wrapper) + expect(mockDelete).toHaveBeenCalled() + expect(mockHistoryPush).toHaveBeenCalledTimes(1) + }) + it('should not reset account if no account', () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.TERMS_VERSION_MISMATCH} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={null} + isUpdating={false} + /> + </Provider> + ) + wrapper.find(Button).at(1).simulate('click') + expect(mockHistoryPush).toHaveBeenCalledTimes(1) + expect(mockDelete).toHaveBeenCalledTimes(0) + }) +}) diff --git a/src/components/Konnector/KonnectorModalFooter.tsx b/src/components/Konnector/KonnectorModalFooter.tsx new file mode 100644 index 0000000000000000000000000000000000000000..799651125281f23d3617295ff5e530b7ff923313 --- /dev/null +++ b/src/components/Konnector/KonnectorModalFooter.tsx @@ -0,0 +1,157 @@ +import React, { useCallback, useState } from 'react' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { + ERROR_EVENT, + SUCCESS_EVENT, +} from 'cozy-harvest-lib/dist/models/flowEvents' +import { FluidType } from 'enum/fluid.enum' +import Button from '@material-ui/core/Button' +import { useHistory } from 'react-router-dom' +import { KonnectorError } from 'enum/konnectorError.enum' +import './konnectorModal.scss' +import AccountService from 'services/account.service' +import { useClient } from 'cozy-client' +import { Account } from 'models' + +interface KonnectorModalFooterProps { + state: string | null + error: KonnectorError | null + fluidType: FluidType + handleCloseClick: (isSuccess?: boolean) => void + handleAccountDeletion: () => Promise<void> + account: Account | null + isUpdating: boolean +} + +const KonnectorModalFooter: React.FC<KonnectorModalFooterProps> = ({ + state, + error, + fluidType, + handleCloseClick, + handleAccountDeletion, + account, + isUpdating, +}: KonnectorModalFooterProps) => { + const { t } = useI18n() + const history = useHistory() + const client = useClient() + const handleSGELoginRetry = useCallback(() => { + handleCloseClick(state === SUCCESS_EVENT) + history.push('/sge-connect') + }, [handleCloseClick, history, state]) + + const handleResetSGEAccount = useCallback(async () => { + if (account) { + const accountService = new AccountService(client) + await accountService.deleteAccount(account) + await handleAccountDeletion() + history.push('/sge-connect') + } + }, [account, client, handleAccountDeletion, history]) + + const errorButtons = () => { + switch (error) { + case KonnectorError.USER_ACTION_NEEDED: + //INSEE CODE ERROR ENEDIS + return ( + <Button + aria-label={t('konnector_modal.accessibility.button_close')} + onClick={() => handleCloseClick(state === SUCCESS_EVENT)} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + style={{ height: '40px' }} + > + <div>{t('konnector_modal.button_understood')}</div> + </Button> + ) + case KonnectorError.LOGIN_FAILED: + //MISMATCH NAME / ADDRESS / PDL + return ( + <Button + aria-label={t('konnector_modal.accessibility.button_close')} + onClick={() => handleCloseClick(state === SUCCESS_EVENT)} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + style={{ height: '40px' }} + > + <div>{t('konnector_modal.button_come_back_later')}</div> + </Button> + ) + case KonnectorError.TERMS_VERSION_MISMATCH: + return ( + <div className="buttons"> + <Button + aria-label={t('konnector_modal.accessibility.button_close')} + onClick={() => handleCloseClick(state === SUCCESS_EVENT)} + classes={{ + root: 'btn-secondary-negative', + label: 'text-16-bold', + }} + style={{ height: '40px' }} + > + <div>{'Plus tard'}</div> + </Button> + <Button + aria-label={t('konnector_modal.accessibility.button_close')} + onClick={ + !isUpdating ? handleSGELoginRetry : handleResetSGEAccount + } + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + style={{ height: '40px' }} + > + <div>{!isUpdating ? 'Vérifier les infos' : 'Jy vais'}</div> + </Button> + </div> + ) + default: + //DEFAULT FOOTER BUTTONS + //TODO change default button + return ( + <Button + aria-label={t('konnector_modal.accessibility.button_close')} + onClick={() => handleCloseClick(state === SUCCESS_EVENT)} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + style={{ height: '40px' }} + > + <div>{t('konnector_modal.button_validate')}</div> + </Button> + ) + } + } + + const successButton = () => { + //DEFAULT FOOTER BUTTONS + return ( + <Button + aria-label={t('konnector_modal.accessibility.button_close')} + onClick={() => handleCloseClick(state === SUCCESS_EVENT)} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + > + <div>{t('konnector_modal.button_validate')}</div> + </Button> + ) + } + + return ( + <> + {state === ERROR_EVENT && fluidType === FluidType.ELECTRICITY + ? errorButtons() + : successButton()} + </> + ) +} + +export default KonnectorModalFooter diff --git a/src/components/Konnector/KonnectorViewerCard.tsx b/src/components/Konnector/KonnectorViewerCard.tsx index 470ab679a1ed35d9b47454d8d6d23191bf44b1bf..73b94b5049e94a4a388e09643b18dffdeac96ce1 100644 --- a/src/components/Konnector/KonnectorViewerCard.tsx +++ b/src/components/Konnector/KonnectorViewerCard.tsx @@ -16,6 +16,7 @@ import { FluidStatus, FluidConnection, UsageEvent, + AccountAuthData, } from 'models' import { getAddPicto, getParamPicto } from 'utils/picto' import { setChallengeConsumption } from 'store/challenge/challenge.actions' @@ -57,6 +58,8 @@ import UsageEventService from 'services/usageEvent.service' import { UsageEventType } from 'enum/usageEvent.enum' import PartnersInfoService from 'services/partnersInfo.service' import { PartnersInfo } from 'models/partnersInfo.model' +import { FluidSlugType } from 'enum/fluidSlug.enum' +import { KonnectorError } from 'enum/konnectorError.enum' interface KonnectorViewerCardProps { fluidStatus: FluidStatus @@ -90,9 +93,11 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ const [openModal, setOpenModal] = useState(false) const [isUpdating, setIsUpdating] = useState(false) - const [konnectorErrorDescription, setKonnectorErrorDescription] = useState< - string | null - >(null) + const [isLogging, setIsLogging] = useState( + fluidSlug !== FluidSlugType.GAS ? true : false + ) + const [konnectorErrorDescription, setKonnectorErrorDescription] = + useState<KonnectorError | null>(null) const [konnectorState, setKonnectorState] = useState<string | null>(null) const [updatedFluidStatus, setUpdatedFluidStatus] = useState<FluidStatus[]>( [] @@ -107,7 +112,6 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ [client] ) - /* eslint-disable @typescript-eslint/no-non-null-assertion */ const lastDataDate = fluidType !== FluidType.MULTIFLUID && statusArray[fluidType].lastDataDate ? statusArray[fluidType].lastDataDate!.toLocaleString() + fluidType @@ -131,7 +135,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ const refDate: DateTime = DateTime.fromISO('0001-01-01') let _lastDataDate: DateTime | null = DateTime.fromISO('0001-01-01') for (const fluid of _updatedFluidStatus) { - if (fluid?.lastDataDate > _lastDataDate) { + if (fluid && fluid?.lastDataDate && fluid?.lastDataDate > _lastDataDate) { _lastDataDate = fluid.lastDataDate } } @@ -183,20 +187,37 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ const handleConnectionEnd = useCallback( async (isSuccess?: boolean) => { if ( - account && - konnectorErrorDescription === 'LOGIN_FAILED' && - fluidStatus !== null && - fluidStatus.connection.account !== null && - fluidStatus.connection.account.auth !== undefined && - fluidStatus.connection.account.auth.login + //CASE FOR GLOBAL LOGIN FAILED + (account && + !isSuccess && + (konnectorErrorDescription === KonnectorError.LOGIN_FAILED || + konnectorErrorDescription === KonnectorError.UNKNOWN_ERROR || + konnectorErrorDescription == KonnectorError.CRITICAL) && + fluidStatus !== null && + fluidStatus.connection.account !== null && + fluidStatus.connection.account.auth !== undefined) || + //CASE FOR ENEDIS CODE INSEE ERROR + (account && + !isSuccess && + !isUpdating && + fluidType === FluidType.ELECTRICITY && + fluidStatus !== null && + fluidStatus.connection.account !== null && + fluidStatus.connection.account.auth !== undefined) ) { - fluidStatus.connection.konnectorConfig.lastKnownCredentials = - fluidStatus.connection.account.auth.login + //KEEP CREDENTIALS FOR EGL + if (fluidSlug === FluidSlugType.WATER) { + const auth = fluidStatus.connection.account.auth as AccountAuthData + fluidStatus.connection.konnectorConfig.lastKnownCredentials = + auth.login + } + //DELETE ACCOUNT const accountService = new AccountService(client) await accountService.deleteAccount(account) await handleAccountDeletion() } else { if (isSuccess && fluidStatus.lastDataDate === null) { + //UPDATE THE DACC EVENT STATUS TO SUCCESS await UsageEventService.udpateConnectionAttemptEvent( client, fluidSlug @@ -219,16 +240,18 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ }, [ account, - client, - dispatch, - fluidService, - fluidStatus, - handleAccountDeletion, konnectorErrorDescription, - partnersInfoService, + fluidStatus, + isUpdating, + fluidType, setActive, - updatedFluidStatus.length, fluidSlug, + client, + handleAccountDeletion, + updatedFluidStatus.length, + partnersInfoService, + fluidService, + dispatch, ] ) @@ -367,7 +390,6 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ return ( <span className="text-16-bold outdated"> {t('konnector_options.outdated', { - // eslint-disable-next-line @typescript-eslint/camelcase isOutdatedData: isOutdatedData, })} </span> @@ -410,8 +432,8 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ callbackResponse(ERROR_EVENT) }) connectionFlow.jobWatcher.on(LOGIN_SUCCESS_EVENT, () => { + setIsLogging(false) sendUsageEventSuccess(fluidSlug, fluidStatus.lastDataDate === null) - callbackResponse(LOGIN_SUCCESS_EVENT) }) connectionFlow.jobWatcher.on(SUCCESS_EVENT, () => { sendUsageEventSuccess(fluidSlug, fluidStatus.lastDataDate === null) @@ -512,10 +534,13 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ <KonnectorModal open={openModal} isUpdating={isUpdating} + isLogging={isLogging} state={konnectorState} error={konnectorErrorDescription} fluidType={fluidStatus.fluidType} handleCloseClick={handleConnectionEnd} + handleAccountDeletion={handleAccountDeletion} + account={account} /> </> ) diff --git a/src/components/Konnector/KonnectorViewerList.spec.tsx b/src/components/Konnector/KonnectorViewerList.spec.tsx index b87e6632f3191d4c3158e0cb5ac0659408ecc138..5e71995a85e25d93277ff8b44bc31b3425f51494 100644 --- a/src/components/Konnector/KonnectorViewerList.spec.tsx +++ b/src/components/Konnector/KonnectorViewerList.spec.tsx @@ -27,7 +27,6 @@ jest.mock('react-router-dom', () => ({ })) describe('KonnectorViewerList component', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any let store: any beforeEach(() => { store = createMockStore(mockInitialEcolyoState) diff --git a/src/components/Konnector/__snapshots__/KonnectorModal.spec.tsx.snap b/src/components/Konnector/__snapshots__/KonnectorModal.spec.tsx.snap index c011bada0e60d4f97ca05b955a146ce9c49bb4d2..e44f9efdc74e909015eabdd95bee8d6d9475e47f 100644 --- a/src/components/Konnector/__snapshots__/KonnectorModal.spec.tsx.snap +++ b/src/components/Konnector/__snapshots__/KonnectorModal.spec.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`KonnectroModal component should be rendered correctly 1`] = ` +exports[`KonnectorModal component should be rendered correctly 1`] = ` <Provider store={ Object { @@ -14,12 +14,5107 @@ exports[`KonnectroModal component should be rendered correctly 1`] = ` } > <KonnectorModal + account={null} error={null} fluidType={0} + handleAccountDeletion={[MockFunction]} handleCloseClick={[MockFunction]} + isLogging={false} isUpdating={false} open={true} state={null} - /> + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={true} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={true} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={true} + onClose={[Function]} + open={true} + > + <ForwardRef(Portal) + disablePortal={false} + > + <Portal + containerInfo={ + <body + style="padding-right: 0px; overflow: hidden;" + > + <div + class="MuiDialog-root modal-root" + role="presentation" + style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;" + > + <div + aria-hidden="true" + class="MuiBackdrop-root" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + /> + <div + data-test="sentinelStart" + tabindex="0" + /> + <div + class="MuiDialog-container MuiDialog-scrollPaper" + role="none presentation" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + tabindex="-1" + > + <div + aria-labelledby="accessibility-title" + class="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + konnector_modal.accessibility.window_title + </div> + <div + class="kmodal-content" + > + <div + aria-label="animation" + role="button" + style="width: 50px; height: 50px; overflow: hidden; margin: 0px auto; outline: none;" + tabindex="0" + title="" + > + <svg + height="128" + preserveAspectRatio="xMidYMid slice" + style="width: 100%; height: 100%; transform: translate3d(0,0,0);" + viewBox="0 0 128 128" + width="128" + xmlns="http://www.w3.org/2000/svg" + > + <defs> + <clippath + id="__lottie_element_2" + > + <rect + height="128" + width="128" + x="0" + y="0" + /> + </clippath> + </defs> + <g + clip-path="url(#__lottie_element_2)" + > + <g + opacity="1" + style="display: block;" + transform="matrix(1,0,0,1,22.5,64)" + > + <path + d=" M10,29.25 C10,29.25 10,45 10,45 C10,47.76100158691406 7.761000156402588,50 5,50 C5,50 -5,50 -5,50 C-7.761000156402588,50 -10,47.76100158691406 -10,45 C-10,45 -10,29.25 -10,29.25 C-10,26.48900032043457 -7.761000156402588,24.25 -5,24.25 C-5,24.25 5,24.25 5,24.25 C7.761000156402588,24.25 10,26.48900032043457 10,29.25z" + fill="rgb(227,184,42)" + fill-opacity="1" + /> + </g> + <g + opacity="1" + style="display: block;" + transform="matrix(1,0,0,1,62.5,64)" + > + <path + d=" M10,-33 C10,-33 10,45 10,45 C10,47.76100158691406 7.761000156402588,50 5,50 C5,50 -5,50 -5,50 C-7.761000156402588,50 -10,47.76100158691406 -10,45 C-10,45 -10,-33 -10,-33 C-10,-35.76100158691406 -7.761000156402588,-38 -5,-38 C-5,-38 5,-38 5,-38 C7.761000156402588,-38 10,-35.76100158691406 10,-33z" + fill="rgb(227,184,42)" + fill-opacity="1" + /> + </g> + <g + opacity="1" + style="display: block;" + transform="matrix(1,0,0,1,102.5,64)" + > + <path + d=" M10,-8.75 C10,-8.75 10,45 10,45 C10,47.76100158691406 7.761000156402588,50 5,50 C5,50 -5,50 -5,50 C-7.761000156402588,50 -10,47.76100158691406 -10,45 C-10,45 -10,-8.75 -10,-8.75 C-10,-11.51099967956543 -7.761000156402588,-13.75 -5,-13.75 C-5,-13.75 5,-13.75 5,-13.75 C7.761000156402588,-13.75 10,-11.51099967956543 10,-8.75z" + fill="rgb(227,184,42)" + fill-opacity="1" + /> + </g> + </g> + </svg> + </div> + <div + class="kmodal-content-text kmodal-content-text-center text-16-normal" + > + <div + class="kc-wait text-16-bold" + > + konnector_modal.loading_data + </div> + </div> + <div + class="kmodal-waiting-text text-18-italic" + > + <div + class="waiting-text show" + > + <p> + La première fois cela peut prendre quelques minutes, par la suite, seulement quelques secondes. + </p> + <p /> + </div> + <div + class="waiting-text" + > + <p> + Afin de limiter le temps de ce premier chargement, un historique réduit de vos consommations va être chargé. Vous aurez tout de même accès à un an d'historique dès à présent. + </p> + <p /> + </div> + <div + class="waiting-text" + > + <p> + Demain matin, vous aurez accès à l'ensemble de vos données (jusqu'à trois ans d'historique). + </p> + <p /> + </div> + <div + class="waiting-text" + > + <p> + Le saviez-vous ? + </p> + <p> + Pour acheminer l’eau sur Lyon (Lugdunum !) l’acqueduc de Gier faisait 86 km à l’époque Romaine ! + </p> + </div> + <div + class="waiting-text" + > + <p> + Rien que de l’eau, de l’eau de pluie, de l’eau de la Métroooooo + </p> + <p> + ♪♪ + </p> + </div> + <div + class="waiting-text" + > + <p> + Le saviez-vous ? + </p> + <p> + Environ 90% de notre électricité provient de centrales de production hors de notre métropole. + </p> + </div> + <div + class="waiting-text" + > + <p> + « Il y a de l’eau dans le gaz » … + </p> + <p> + Avec Ecolyo c’est l’eau AVEC le gaz. + </p> + </div> + <div + class="waiting-text" + > + <p> + Le saviez-vous ? + </p> + <p> + La consommation énergétique résidentielle représente environ 30% de la consommation énergétique totale de notre territoire. + </p> + </div> + <div + class="waiting-text" + > + <p> + Le saviez-vous ? + </p> + <p> + La Métropole de Lyon a été territoire d’expérimentation Linky. Le compteur est présent sur notre territoire depuis plus de 10 ans ! + </p> + </div> + <div + class="waiting-text" + > + <p> + Le saviez-vous ? + </p> + <p> + 10 minutes d'aération par jour permettent à notre habitat d’être plus sain, avec un air renouvelé, moins de polluants et l’évacuation de l’humidité qui stagne et qui nous oblige à consommer plus de chauffage. + </p> + </div> + <div + class="waiting-text" + > + <p> + Le saviez-vous ? + </p> + <p> + 2°C ! C’est la différence qu’on peut mesurer dans une rue bien arborée en comparaison d’une rue vide : la végétation est donc cruciale pour le bien être en ville l’été et pour limiter l’installation des climatiseurs. + </p> + </div> + <div + class="waiting-text" + > + <p> + Il y a les bonnes pratiques de consommations énergétiques (et Ecolyo est là pour cela !) mais aussi et bien sûr, la rénovation. + </p> + <p> + Le saviez-vous ? La loi énergie climat de 2019 impose que d’ici 2025, les bâtiments privés résidentiels les plus énergivores soient tous rénovés ! + </p> + </div> + </div> + </div> + </div> + </div> + <div + data-test="sentinelEnd" + tabindex="0" + /> + </div> + </body> + } + > + <div + className="MuiDialog-root modal-root" + onKeyDown={[Function]} + role="presentation" + style={ + Object { + "bottom": 0, + "left": 0, + "position": "fixed", + "right": 0, + "top": 0, + "zIndex": 1300, + } + } + > + <WithStyles(ForwardRef(Backdrop)) + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Backdrop) + classes={ + Object { + "invisible": "MuiBackdrop-invisible", + "root": "MuiBackdrop-root", + } + } + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Fade) + in={true} + onClick={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onClick={[Function]} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + aria-hidden={true} + className="MuiBackdrop-root" + onClick={[Function]} + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + /> + </Transition> + </ForwardRef(Fade)> + </ForwardRef(Backdrop)> + </WithStyles(ForwardRef(Backdrop))> + <Unstable_TrapFocus + disableAutoFocus={false} + disableEnforceFocus={false} + disableRestoreFocus={false} + getDoc={[Function]} + isEnabled={[Function]} + open={true} + > + <div + data-test="sentinelStart" + tabIndex={0} + /> + <ForwardRef(Fade) + appear={true} + in={true} + onEnter={[Function]} + onExited={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + className="MuiDialog-container MuiDialog-scrollPaper" + onMouseDown={[Function]} + onMouseUp={[Function]} + role="none presentation" + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + tabIndex="-1" + > + <WithStyles(ForwardRef(Paper)) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + elevation={24} + role="dialog" + > + <ForwardRef(Paper) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + classes={ + Object { + "elevation0": "MuiPaper-elevation0", + "elevation1": "MuiPaper-elevation1", + "elevation10": "MuiPaper-elevation10", + "elevation11": "MuiPaper-elevation11", + "elevation12": "MuiPaper-elevation12", + "elevation13": "MuiPaper-elevation13", + "elevation14": "MuiPaper-elevation14", + "elevation15": "MuiPaper-elevation15", + "elevation16": "MuiPaper-elevation16", + "elevation17": "MuiPaper-elevation17", + "elevation18": "MuiPaper-elevation18", + "elevation19": "MuiPaper-elevation19", + "elevation2": "MuiPaper-elevation2", + "elevation20": "MuiPaper-elevation20", + "elevation21": "MuiPaper-elevation21", + "elevation22": "MuiPaper-elevation22", + "elevation23": "MuiPaper-elevation23", + "elevation24": "MuiPaper-elevation24", + "elevation3": "MuiPaper-elevation3", + "elevation4": "MuiPaper-elevation4", + "elevation5": "MuiPaper-elevation5", + "elevation6": "MuiPaper-elevation6", + "elevation7": "MuiPaper-elevation7", + "elevation8": "MuiPaper-elevation8", + "elevation9": "MuiPaper-elevation9", + "outlined": "MuiPaper-outlined", + "root": "MuiPaper-root", + "rounded": "MuiPaper-rounded", + } + } + elevation={24} + role="dialog" + > + <div + aria-labelledby="accessibility-title" + className="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + konnector_modal.accessibility.window_title + </div> + <div + className="kmodal-content" + > + <Lottie + ariaLabel="animation" + ariaRole="button" + eventListeners={Array []} + height={50} + isClickToPauseDisabled={false} + isPaused={false} + isStopped={false} + options={ + Object { + "animationData": Object { + "__complete": true, + "assets": Array [], + "ddd": 0, + "default": Object { + "assets": Array [], + "ddd": 0, + "fr": 30, + "h": 128, + "ip": 0, + "layers": Array [ + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 0, + 50, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 102.5, + 114, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "nm": "Shape Layer 2", + "op": 61, + "shapes": Array [ + Object { + "_render": true, + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.665, + "y": 1, + }, + "o": Object { + "x": 0.088, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -11.511, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -8.75, + ], + Array [ + -7.761, + -13.75, + ], + Array [ + 5, + -13.75, + ], + ], + "o": Array [ + Array [ + 10, + -8.75, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -11.511, + ], + Array [ + -5, + -13.75, + ], + Array [ + 7.761, + -13.75, + ], + ], + "v": Array [ + Array [ + 10, + -8.75, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -8.75, + ], + Array [ + -5, + -13.75, + ], + Array [ + 5, + -13.75, + ], + ], + }, + ], + "t": 0, + }, + Object { + "i": Object { + "x": 0.888, + "y": 0.992, + }, + "o": Object { + "x": 0.315, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -32.261, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -29.5, + ], + Array [ + -7.761, + -34.5, + ], + Array [ + 5, + -34.5, + ], + ], + "o": Array [ + Array [ + 10, + -29.5, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -32.261, + ], + Array [ + -5, + -34.5, + ], + Array [ + 7.761, + -34.5, + ], + ], + "v": Array [ + Array [ + 10, + -29.5, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -29.5, + ], + Array [ + -5, + -34.5, + ], + Array [ + 5, + -34.5, + ], + ], + }, + ], + "t": 15, + }, + Object { + "i": Object { + "x": 0.777, + "y": 1, + }, + "o": Object { + "x": 0.117, + "y": 0.013, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -11.511, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -8.75, + ], + Array [ + -7.761, + -13.75, + ], + Array [ + 5, + -13.75, + ], + ], + "o": Array [ + Array [ + 10, + -8.75, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -11.511, + ], + Array [ + -5, + -13.75, + ], + Array [ + 7.761, + -13.75, + ], + ], + "v": Array [ + Array [ + 10, + -8.75, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -8.75, + ], + Array [ + -5, + -13.75, + ], + Array [ + 5, + -13.75, + ], + ], + }, + ], + "t": 30, + }, + Object { + "i": Object { + "x": 0.853, + "y": 1, + }, + "o": Object { + "x": 0.098, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 15.989, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 18.75, + ], + Array [ + -7.761, + 13.75, + ], + Array [ + 5, + 13.75, + ], + ], + "o": Array [ + Array [ + 10, + 18.75, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 15.989, + ], + Array [ + -5, + 13.75, + ], + Array [ + 7.761, + 13.75, + ], + ], + "v": Array [ + Array [ + 10, + 18.75, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 18.75, + ], + Array [ + -5, + 13.75, + ], + Array [ + 5, + 13.75, + ], + ], + }, + ], + "t": 46, + }, + Object { + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -11.511, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -8.75, + ], + Array [ + -7.761, + -13.75, + ], + Array [ + 5, + -13.75, + ], + ], + "o": Array [ + Array [ + 10, + -8.75, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -11.511, + ], + Array [ + -5, + -13.75, + ], + Array [ + 7.761, + -13.75, + ], + ], + "v": Array [ + Array [ + 10, + -8.75, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -8.75, + ], + Array [ + -5, + -13.75, + ], + Array [ + 5, + -13.75, + ], + ], + }, + ], + "t": 60, + }, + ], + }, + "mn": "ADBE Vector Shape - Group", + "nm": "Path 1", + "ty": "sh", + }, + Object { + "_render": true, + "bm": 0, + "c": Object { + "a": 0, + "ix": 4, + "k": Array [ + 0.8901960784313725, + 0.7215686274509804, + 0.16470588235294117, + 1, + ], + }, + "hd": false, + "mn": "ADBE Vector Graphic - Fill", + "nm": "Fill 1", + "o": Object { + "a": 0, + "ix": 5, + "k": 100, + }, + "r": 1, + "ty": "fl", + }, + ], + "sr": 1, + "st": 0, + "ty": 4, + }, + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 0, + 50, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 62.5, + 114, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "nm": "Shape Layer 3", + "op": 61, + "shapes": Array [ + Object { + "_render": true, + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.631, + "y": 1, + }, + "o": Object { + "x": 0.167, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -35.761, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -33, + ], + Array [ + -7.761, + -38, + ], + Array [ + 5, + -38, + ], + ], + "o": Array [ + Array [ + 10, + -33, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -35.761, + ], + Array [ + -5, + -38, + ], + Array [ + 7.761, + -38, + ], + ], + "v": Array [ + Array [ + 10, + -33, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -33, + ], + Array [ + -5, + -38, + ], + Array [ + 5, + -38, + ], + ], + }, + ], + "t": 0, + }, + Object { + "i": Object { + "x": 0.667, + "y": 1, + }, + "o": Object { + "x": 0.391, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 1.2389999999999999, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 4, + ], + Array [ + -7.761, + -1, + ], + Array [ + 5, + -1, + ], + ], + "o": Array [ + Array [ + 10, + 4, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 1.2389999999999999, + ], + Array [ + -5, + -1, + ], + Array [ + 7.761, + -1, + ], + ], + "v": Array [ + Array [ + 10, + 4, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 4, + ], + Array [ + -5, + -1, + ], + Array [ + 5, + -1, + ], + ], + }, + ], + "t": 13.846, + }, + Object { + "i": Object { + "x": 0.88, + "y": 1, + }, + "o": Object { + "x": 0.093, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -35.761, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -33, + ], + Array [ + -7.761, + -38, + ], + Array [ + 5, + -38, + ], + ], + "o": Array [ + Array [ + 10, + -33, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -35.761, + ], + Array [ + -5, + -38, + ], + Array [ + 7.761, + -38, + ], + ], + "v": Array [ + Array [ + 10, + -33, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -33, + ], + Array [ + -5, + -38, + ], + Array [ + 5, + -38, + ], + ], + }, + ], + "t": 27, + }, + Object { + "i": Object { + "x": 0.873, + "y": 1, + }, + "o": Object { + "x": 0.165, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 9.114, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 11.875, + ], + Array [ + -7.761, + 6.875, + ], + Array [ + 5, + 6.875, + ], + ], + "o": Array [ + Array [ + 10, + 11.875, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 9.114, + ], + Array [ + -5, + 6.875, + ], + Array [ + 7.761, + 6.875, + ], + ], + "v": Array [ + Array [ + 10, + 11.875, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 11.875, + ], + Array [ + -5, + 6.875, + ], + Array [ + 5, + 6.875, + ], + ], + }, + ], + "t": 45, + }, + Object { + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -35.761, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -33, + ], + Array [ + -7.761, + -38, + ], + Array [ + 5, + -38, + ], + ], + "o": Array [ + Array [ + 10, + -33, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -35.761, + ], + Array [ + -5, + -38, + ], + Array [ + 7.761, + -38, + ], + ], + "v": Array [ + Array [ + 10, + -33, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -33, + ], + Array [ + -5, + -38, + ], + Array [ + 5, + -38, + ], + ], + }, + ], + "t": 60, + }, + ], + }, + "mn": "ADBE Vector Shape - Group", + "nm": "Path 1", + "ty": "sh", + }, + Object { + "_render": true, + "bm": 0, + "c": Object { + "a": 0, + "ix": 4, + "k": Array [ + 0.8901960784313725, + 0.7215686274509804, + 0.16470588235294117, + 1, + ], + }, + "hd": false, + "mn": "ADBE Vector Graphic - Fill", + "nm": "Fill 1", + "o": Object { + "a": 0, + "ix": 5, + "k": 100, + }, + "r": 1, + "ty": "fl", + }, + ], + "sr": 1, + "st": 0, + "ty": 4, + }, + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "ind": 3, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 0, + 50, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 22.5, + 114, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "nm": "Shape Layer 4", + "op": 61, + "shapes": Array [ + Object { + "_render": true, + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.562, + "y": 1, + }, + "o": Object { + "x": 0.46, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 26.489, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 29.25, + ], + Array [ + -7.761, + 24.25, + ], + Array [ + 5, + 24.25, + ], + ], + "o": Array [ + Array [ + 10, + 29.25, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 26.489, + ], + Array [ + -5, + 24.25, + ], + Array [ + 7.761, + 24.25, + ], + ], + "v": Array [ + Array [ + 10, + 29.25, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 29.25, + ], + Array [ + -5, + 24.25, + ], + Array [ + 5, + 24.25, + ], + ], + }, + ], + "t": 0, + }, + Object { + "i": Object { + "x": 0.505, + "y": 1, + }, + "o": Object { + "x": 0.402, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 10.239, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 13, + ], + Array [ + -7.761, + 8, + ], + Array [ + 5, + 8, + ], + ], + "o": Array [ + Array [ + 10, + 13, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 10.239, + ], + Array [ + -5, + 8, + ], + Array [ + 7.761, + 8, + ], + ], + "v": Array [ + Array [ + 10, + 13, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 13, + ], + Array [ + -5, + 8, + ], + Array [ + 5, + 8, + ], + ], + }, + ], + "t": 15, + }, + Object { + "i": Object { + "x": 0.407, + "y": 1, + }, + "o": Object { + "x": 0.167, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 26.489, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 29.25, + ], + Array [ + -7.761, + 24.25, + ], + Array [ + 5, + 24.25, + ], + ], + "o": Array [ + Array [ + 10, + 29.25, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 26.489, + ], + Array [ + -5, + 24.25, + ], + Array [ + 7.761, + 24.25, + ], + ], + "v": Array [ + Array [ + 10, + 29.25, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 29.25, + ], + Array [ + -5, + 24.25, + ], + Array [ + 5, + 24.25, + ], + ], + }, + ], + "t": 32, + }, + Object { + "i": Object { + "x": 0.599, + "y": 1, + }, + "o": Object { + "x": 0.526, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 0.23899999999999988, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 3, + ], + Array [ + -7.761, + -2, + ], + Array [ + 5, + -2, + ], + ], + "o": Array [ + Array [ + 10, + 3, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 0.23899999999999988, + ], + Array [ + -5, + -2, + ], + Array [ + 7.761, + -2, + ], + ], + "v": Array [ + Array [ + 10, + 3, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 3, + ], + Array [ + -5, + -2, + ], + Array [ + 5, + -2, + ], + ], + }, + ], + "t": 47, + }, + Object { + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 26.489, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 29.25, + ], + Array [ + -7.761, + 24.25, + ], + Array [ + 5, + 24.25, + ], + ], + "o": Array [ + Array [ + 10, + 29.25, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 26.489, + ], + Array [ + -5, + 24.25, + ], + Array [ + 7.761, + 24.25, + ], + ], + "v": Array [ + Array [ + 10, + 29.25, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 29.25, + ], + Array [ + -5, + 24.25, + ], + Array [ + 5, + 24.25, + ], + ], + }, + ], + "t": 60, + }, + ], + }, + "mn": "ADBE Vector Shape - Group", + "nm": "Path 1", + "ty": "sh", + }, + Object { + "_render": true, + "bm": 0, + "c": Object { + "a": 0, + "ix": 4, + "k": Array [ + 0.8901960784313725, + 0.7215686274509804, + 0.16470588235294117, + 1, + ], + }, + "hd": false, + "mn": "ADBE Vector Graphic - Fill", + "nm": "Fill 1", + "o": Object { + "a": 0, + "ix": 5, + "k": 100, + }, + "r": 1, + "ty": "fl", + }, + ], + "sr": 1, + "st": 0, + "ty": 4, + }, + ], + "markers": Array [], + "nm": "Comp 1", + "op": 60, + "v": "5.5.8", + "w": 128, + }, + "fr": 30, + "h": 128, + "ip": 0, + "layers": Array [ + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 0, + 50, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 102.5, + 114, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "nm": "Shape Layer 2", + "op": 61, + "shapes": Array [ + Object { + "_render": true, + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.665, + "y": 1, + }, + "o": Object { + "x": 0.088, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -11.511, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -8.75, + ], + Array [ + -7.761, + -13.75, + ], + Array [ + 5, + -13.75, + ], + ], + "o": Array [ + Array [ + 10, + -8.75, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -11.511, + ], + Array [ + -5, + -13.75, + ], + Array [ + 7.761, + -13.75, + ], + ], + "v": Array [ + Array [ + 10, + -8.75, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -8.75, + ], + Array [ + -5, + -13.75, + ], + Array [ + 5, + -13.75, + ], + ], + }, + ], + "t": 0, + }, + Object { + "i": Object { + "x": 0.888, + "y": 0.992, + }, + "o": Object { + "x": 0.315, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -32.261, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -29.5, + ], + Array [ + -7.761, + -34.5, + ], + Array [ + 5, + -34.5, + ], + ], + "o": Array [ + Array [ + 10, + -29.5, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -32.261, + ], + Array [ + -5, + -34.5, + ], + Array [ + 7.761, + -34.5, + ], + ], + "v": Array [ + Array [ + 10, + -29.5, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -29.5, + ], + Array [ + -5, + -34.5, + ], + Array [ + 5, + -34.5, + ], + ], + }, + ], + "t": 15, + }, + Object { + "i": Object { + "x": 0.777, + "y": 1, + }, + "o": Object { + "x": 0.117, + "y": 0.013, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -11.511, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -8.75, + ], + Array [ + -7.761, + -13.75, + ], + Array [ + 5, + -13.75, + ], + ], + "o": Array [ + Array [ + 10, + -8.75, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -11.511, + ], + Array [ + -5, + -13.75, + ], + Array [ + 7.761, + -13.75, + ], + ], + "v": Array [ + Array [ + 10, + -8.75, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -8.75, + ], + Array [ + -5, + -13.75, + ], + Array [ + 5, + -13.75, + ], + ], + }, + ], + "t": 30, + }, + Object { + "i": Object { + "x": 0.853, + "y": 1, + }, + "o": Object { + "x": 0.098, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 15.989, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 18.75, + ], + Array [ + -7.761, + 13.75, + ], + Array [ + 5, + 13.75, + ], + ], + "o": Array [ + Array [ + 10, + 18.75, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 15.989, + ], + Array [ + -5, + 13.75, + ], + Array [ + 7.761, + 13.75, + ], + ], + "v": Array [ + Array [ + 10, + 18.75, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 18.75, + ], + Array [ + -5, + 13.75, + ], + Array [ + 5, + 13.75, + ], + ], + }, + ], + "t": 46, + }, + Object { + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -11.511, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -8.75, + ], + Array [ + -7.761, + -13.75, + ], + Array [ + 5, + -13.75, + ], + ], + "o": Array [ + Array [ + 10, + -8.75, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -11.511, + ], + Array [ + -5, + -13.75, + ], + Array [ + 7.761, + -13.75, + ], + ], + "v": Array [ + Array [ + 10, + -8.75, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -8.75, + ], + Array [ + -5, + -13.75, + ], + Array [ + 5, + -13.75, + ], + ], + }, + ], + "t": 60, + }, + ], + }, + "mn": "ADBE Vector Shape - Group", + "nm": "Path 1", + "ty": "sh", + }, + Object { + "_render": true, + "bm": 0, + "c": Object { + "a": 0, + "ix": 4, + "k": Array [ + 0.8901960784313725, + 0.7215686274509804, + 0.16470588235294117, + 1, + ], + }, + "hd": false, + "mn": "ADBE Vector Graphic - Fill", + "nm": "Fill 1", + "o": Object { + "a": 0, + "ix": 5, + "k": 100, + }, + "r": 1, + "ty": "fl", + }, + ], + "sr": 1, + "st": 0, + "ty": 4, + }, + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 0, + 50, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 62.5, + 114, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "nm": "Shape Layer 3", + "op": 61, + "shapes": Array [ + Object { + "_render": true, + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.631, + "y": 1, + }, + "o": Object { + "x": 0.167, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -35.761, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -33, + ], + Array [ + -7.761, + -38, + ], + Array [ + 5, + -38, + ], + ], + "o": Array [ + Array [ + 10, + -33, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -35.761, + ], + Array [ + -5, + -38, + ], + Array [ + 7.761, + -38, + ], + ], + "v": Array [ + Array [ + 10, + -33, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -33, + ], + Array [ + -5, + -38, + ], + Array [ + 5, + -38, + ], + ], + }, + ], + "t": 0, + }, + Object { + "i": Object { + "x": 0.667, + "y": 1, + }, + "o": Object { + "x": 0.391, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 1.2389999999999999, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 4, + ], + Array [ + -7.761, + -1, + ], + Array [ + 5, + -1, + ], + ], + "o": Array [ + Array [ + 10, + 4, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 1.2389999999999999, + ], + Array [ + -5, + -1, + ], + Array [ + 7.761, + -1, + ], + ], + "v": Array [ + Array [ + 10, + 4, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 4, + ], + Array [ + -5, + -1, + ], + Array [ + 5, + -1, + ], + ], + }, + ], + "t": 13.846, + }, + Object { + "i": Object { + "x": 0.88, + "y": 1, + }, + "o": Object { + "x": 0.093, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -35.761, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -33, + ], + Array [ + -7.761, + -38, + ], + Array [ + 5, + -38, + ], + ], + "o": Array [ + Array [ + 10, + -33, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -35.761, + ], + Array [ + -5, + -38, + ], + Array [ + 7.761, + -38, + ], + ], + "v": Array [ + Array [ + 10, + -33, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -33, + ], + Array [ + -5, + -38, + ], + Array [ + 5, + -38, + ], + ], + }, + ], + "t": 27, + }, + Object { + "i": Object { + "x": 0.873, + "y": 1, + }, + "o": Object { + "x": 0.165, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 9.114, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 11.875, + ], + Array [ + -7.761, + 6.875, + ], + Array [ + 5, + 6.875, + ], + ], + "o": Array [ + Array [ + 10, + 11.875, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 9.114, + ], + Array [ + -5, + 6.875, + ], + Array [ + 7.761, + 6.875, + ], + ], + "v": Array [ + Array [ + 10, + 11.875, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 11.875, + ], + Array [ + -5, + 6.875, + ], + Array [ + 5, + 6.875, + ], + ], + }, + ], + "t": 45, + }, + Object { + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + -35.761, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + -33, + ], + Array [ + -7.761, + -38, + ], + Array [ + 5, + -38, + ], + ], + "o": Array [ + Array [ + 10, + -33, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -35.761, + ], + Array [ + -5, + -38, + ], + Array [ + 7.761, + -38, + ], + ], + "v": Array [ + Array [ + 10, + -33, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + -33, + ], + Array [ + -5, + -38, + ], + Array [ + 5, + -38, + ], + ], + }, + ], + "t": 60, + }, + ], + }, + "mn": "ADBE Vector Shape - Group", + "nm": "Path 1", + "ty": "sh", + }, + Object { + "_render": true, + "bm": 0, + "c": Object { + "a": 0, + "ix": 4, + "k": Array [ + 0.8901960784313725, + 0.7215686274509804, + 0.16470588235294117, + 1, + ], + }, + "hd": false, + "mn": "ADBE Vector Graphic - Fill", + "nm": "Fill 1", + "o": Object { + "a": 0, + "ix": 5, + "k": 100, + }, + "r": 1, + "ty": "fl", + }, + ], + "sr": 1, + "st": 0, + "ty": 4, + }, + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "ind": 3, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 0, + 50, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 22.5, + 114, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "nm": "Shape Layer 4", + "op": 61, + "shapes": Array [ + Object { + "_render": true, + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.562, + "y": 1, + }, + "o": Object { + "x": 0.46, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 26.489, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 29.25, + ], + Array [ + -7.761, + 24.25, + ], + Array [ + 5, + 24.25, + ], + ], + "o": Array [ + Array [ + 10, + 29.25, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 26.489, + ], + Array [ + -5, + 24.25, + ], + Array [ + 7.761, + 24.25, + ], + ], + "v": Array [ + Array [ + 10, + 29.25, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 29.25, + ], + Array [ + -5, + 24.25, + ], + Array [ + 5, + 24.25, + ], + ], + }, + ], + "t": 0, + }, + Object { + "i": Object { + "x": 0.505, + "y": 1, + }, + "o": Object { + "x": 0.402, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 10.239, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 13, + ], + Array [ + -7.761, + 8, + ], + Array [ + 5, + 8, + ], + ], + "o": Array [ + Array [ + 10, + 13, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 10.239, + ], + Array [ + -5, + 8, + ], + Array [ + 7.761, + 8, + ], + ], + "v": Array [ + Array [ + 10, + 13, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 13, + ], + Array [ + -5, + 8, + ], + Array [ + 5, + 8, + ], + ], + }, + ], + "t": 15, + }, + Object { + "i": Object { + "x": 0.407, + "y": 1, + }, + "o": Object { + "x": 0.167, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 26.489, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 29.25, + ], + Array [ + -7.761, + 24.25, + ], + Array [ + 5, + 24.25, + ], + ], + "o": Array [ + Array [ + 10, + 29.25, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 26.489, + ], + Array [ + -5, + 24.25, + ], + Array [ + 7.761, + 24.25, + ], + ], + "v": Array [ + Array [ + 10, + 29.25, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 29.25, + ], + Array [ + -5, + 24.25, + ], + Array [ + 5, + 24.25, + ], + ], + }, + ], + "t": 32, + }, + Object { + "i": Object { + "x": 0.599, + "y": 1, + }, + "o": Object { + "x": 0.526, + "y": 0, + }, + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 0.23899999999999988, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 3, + ], + Array [ + -7.761, + -2, + ], + Array [ + 5, + -2, + ], + ], + "o": Array [ + Array [ + 10, + 3, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 0.23899999999999988, + ], + Array [ + -5, + -2, + ], + Array [ + 7.761, + -2, + ], + ], + "v": Array [ + Array [ + 10, + 3, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 3, + ], + Array [ + -5, + -2, + ], + Array [ + 5, + -2, + ], + ], + }, + ], + "t": 47, + }, + Object { + "s": Array [ + Object { + "c": true, + "i": Array [ + Array [ + 10, + 26.489, + ], + Array [ + 10, + 45, + ], + Array [ + 7.761, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 47.761, + ], + Array [ + -10, + 29.25, + ], + Array [ + -7.761, + 24.25, + ], + Array [ + 5, + 24.25, + ], + ], + "o": Array [ + Array [ + 10, + 29.25, + ], + Array [ + 10, + 47.761, + ], + Array [ + 5, + 50, + ], + Array [ + -7.761, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 26.489, + ], + Array [ + -5, + 24.25, + ], + Array [ + 7.761, + 24.25, + ], + ], + "v": Array [ + Array [ + 10, + 29.25, + ], + Array [ + 10, + 45, + ], + Array [ + 5, + 50, + ], + Array [ + -5, + 50, + ], + Array [ + -10, + 45, + ], + Array [ + -10, + 29.25, + ], + Array [ + -5, + 24.25, + ], + Array [ + 5, + 24.25, + ], + ], + }, + ], + "t": 60, + }, + ], + }, + "mn": "ADBE Vector Shape - Group", + "nm": "Path 1", + "ty": "sh", + }, + Object { + "_render": true, + "bm": 0, + "c": Object { + "a": 0, + "ix": 4, + "k": Array [ + 0.8901960784313725, + 0.7215686274509804, + 0.16470588235294117, + 1, + ], + }, + "hd": false, + "mn": "ADBE Vector Graphic - Fill", + "nm": "Fill 1", + "o": Object { + "a": 0, + "ix": 5, + "k": 100, + }, + "r": 1, + "ty": "fl", + }, + ], + "sr": 1, + "st": 0, + "ty": 4, + }, + ], + "markers": Array [], + "nm": "Comp 1", + "op": 60, + "v": "5.5.8", + "w": 128, + }, + "autoplay": true, + "loop": true, + "rendererSettings": Object { + "preserveAspectRatio": "xMidYMid slice", + }, + } + } + speed={2} + title="" + width={50} + > + <div + aria-label="animation" + onClick={[Function]} + role="button" + style={ + Object { + "height": "50px", + "margin": "0 auto", + "outline": "none", + "overflow": "hidden", + "width": "50px", + } + } + tabIndex="0" + title="" + /> + </Lottie> + <div + className="kmodal-content-text kmodal-content-text-center text-16-normal" + > + <div + className="kc-wait text-16-bold" + > + konnector_modal.loading_data + </div> + </div> + <div + className="kmodal-waiting-text text-18-italic" + > + <div + className="waiting-text show" + key="0" + > + <p> + La première fois cela peut prendre quelques minutes, par la suite, seulement quelques secondes. + </p> + <p /> + </div> + <div + className="waiting-text" + key="1" + > + <p> + Afin de limiter le temps de ce premier chargement, un historique réduit de vos consommations va être chargé. Vous aurez tout de même accès à un an d'historique dès à présent. + </p> + <p /> + </div> + <div + className="waiting-text" + key="2" + > + <p> + Demain matin, vous aurez accès à l'ensemble de vos données (jusqu'à trois ans d'historique). + </p> + <p /> + </div> + <div + className="waiting-text" + key="3" + > + <p> + Le saviez-vous ? + </p> + <p> + Pour acheminer l’eau sur Lyon (Lugdunum !) l’acqueduc de Gier faisait 86 km à l’époque Romaine ! + </p> + </div> + <div + className="waiting-text" + key="4" + > + <p> + Rien que de l’eau, de l’eau de pluie, de l’eau de la Métroooooo + </p> + <p> + ♪♪ + </p> + </div> + <div + className="waiting-text" + key="5" + > + <p> + Le saviez-vous ? + </p> + <p> + Environ 90% de notre électricité provient de centrales de production hors de notre métropole. + </p> + </div> + <div + className="waiting-text" + key="6" + > + <p> + « Il y a de l’eau dans le gaz » … + </p> + <p> + Avec Ecolyo c’est l’eau AVEC le gaz. + </p> + </div> + <div + className="waiting-text" + key="7" + > + <p> + Le saviez-vous ? + </p> + <p> + La consommation énergétique résidentielle représente environ 30% de la consommation énergétique totale de notre territoire. + </p> + </div> + <div + className="waiting-text" + key="8" + > + <p> + Le saviez-vous ? + </p> + <p> + La Métropole de Lyon a été territoire d’expérimentation Linky. Le compteur est présent sur notre territoire depuis plus de 10 ans ! + </p> + </div> + <div + className="waiting-text" + key="9" + > + <p> + Le saviez-vous ? + </p> + <p> + 10 minutes d'aération par jour permettent à notre habitat d’être plus sain, avec un air renouvelé, moins de polluants et l’évacuation de l’humidité qui stagne et qui nous oblige à consommer plus de chauffage. + </p> + </div> + <div + className="waiting-text" + key="10" + > + <p> + Le saviez-vous ? + </p> + <p> + 2°C ! C’est la différence qu’on peut mesurer dans une rue bien arborée en comparaison d’une rue vide : la végétation est donc cruciale pour le bien être en ville l’été et pour limiter l’installation des climatiseurs. + </p> + </div> + <div + className="waiting-text" + key="11" + > + <p> + Il y a les bonnes pratiques de consommations énergétiques (et Ecolyo est là pour cela !) mais aussi et bien sûr, la rénovation. + </p> + <p> + Le saviez-vous ? La loi énergie climat de 2019 impose que d’ici 2025, les bâtiments privés résidentiels les plus énergivores soient tous rénovés ! + </p> + </div> + </div> + </div> + </div> + </ForwardRef(Paper)> + </WithStyles(ForwardRef(Paper))> + </div> + </Transition> + </ForwardRef(Fade)> + <div + data-test="sentinelEnd" + tabIndex={0} + /> + </Unstable_TrapFocus> + </div> + </Portal> + </ForwardRef(Portal)> + </ForwardRef(Modal)> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </KonnectorModal> </Provider> `; diff --git a/src/components/Konnector/__snapshots__/KonnectorModalFooter.spec.tsx.snap b/src/components/Konnector/__snapshots__/KonnectorModalFooter.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..527aa6f28cc29dd6db93240fe135b592d52877e6 --- /dev/null +++ b/src/components/Konnector/__snapshots__/KonnectorModalFooter.spec.tsx.snap @@ -0,0 +1,160 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`KonnectorModalFooter component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <KonnectorModalFooter + account={null} + error={null} + fluidType={0} + handleAccountDeletion={[MockFunction]} + handleCloseClick={[MockFunction]} + isUpdating={false} + state={null} + > + <WithStyles(ForwardRef(Button)) + aria-label="konnector_modal.accessibility.button_close" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-highlight", + } + } + onClick={[Function]} + > + <ForwardRef(Button) + aria-label="konnector_modal.accessibility.button_close" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="konnector_modal.accessibility.button_close" + className="MuiButton-root btn-highlight MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="konnector_modal.accessibility.button_close" + className="MuiButton-root btn-highlight MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <button + aria-label="konnector_modal.accessibility.button_close" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + <div> + konnector_modal.button_validate + </div> + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </KonnectorModalFooter> +</Provider> +`; diff --git a/src/components/Konnector/konnectorModal.scss b/src/components/Konnector/konnectorModal.scss index 670a58bb1cf76da2b12a2c1c6ee2a711fb5497e2..8b054b37a5a872fa25da6a6508bc5101b0f8e9ed 100644 --- a/src/components/Konnector/konnectorModal.scss +++ b/src/components/Konnector/konnectorModal.scss @@ -43,16 +43,33 @@ } .kmodal-info { - margin: 1.5rem; + margin: 1rem; text-align: center; - + .buttons { + display: flex; + gap: 0.825rem; + } .konnector-config { align-items: center; display: flex; flex-direction: column; justify-content: center; text-align: center; - + .elec-fail { + color: $grey-bright; + margin-top: 1rem; + } + &.mismatch { + .title { + color: $orange; + } + div { + margin-bottom: 1rem; + } + .info { + color: $grey-bright; + } + } .kce-picto-txt { color: $red-primary; margin: 1.25rem; diff --git a/src/components/Navbar/navBar.scss b/src/components/Navbar/navBar.scss index d9b924b35db71101867b68dbe59387a300f817b6..d324820e81ed9f86a44cf9ddff6caa300b84ab2e 100644 --- a/src/components/Navbar/navBar.scss +++ b/src/components/Navbar/navBar.scss @@ -3,7 +3,7 @@ @import 'src/styles/base/z-index'; .o-sidebar { - background-color: $dark-light; + background-color: $bottom-bar-grey; box-shadow: 0px 5px 5px rgba(0, 0, 0, 0.2), 0px 3px 14px rgba(0, 0, 0, 0.12), 0px 8px 10px rgba(0, 0, 0, 0.14); border-top: unset; diff --git a/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap b/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap index 6c4bfa3e7818464f168fba11ce330ff0bfee6ba0..34b0a12811a6dd85b4f9704552f139c334371c06 100644 --- a/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap +++ b/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap @@ -26,7 +26,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "name": "", "oauth": false, "siteLink": "", - "slug": "", + "slug": "enedis-sge-grandlyon", }, "shouldLaunchKonnector": false, "trigger": null, @@ -47,7 +47,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "name": "", "oauth": false, "siteLink": "", - "slug": "", + "slug": "eglgrandlyon", }, "shouldLaunchKonnector": false, "trigger": null, @@ -68,7 +68,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "name": "", "oauth": false, "siteLink": "", - "slug": "", + "slug": "grdfgrandlyon", }, "shouldLaunchKonnector": false, "trigger": null, diff --git a/src/components/ProfileType/ProfileTypeFormDateSelection.tsx b/src/components/ProfileType/ProfileTypeFormDateSelection.tsx index 9b85807d035ec1d65d5ecee9f225a95a8d867620..fcdebab17dacde7581fd5202857905db27993499 100644 --- a/src/components/ProfileType/ProfileTypeFormDateSelection.tsx +++ b/src/components/ProfileType/ProfileTypeFormDateSelection.tsx @@ -1,10 +1,8 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - import React, { useCallback, useEffect, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import ProfileTypeProgress from 'components/ProfileType/ProfileTypeProgress' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormProgress from 'components/FormGlobal/FormProgress' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { ProfileTypeStepForm } from 'enum/profileType.enum' import { ProfileType, @@ -181,7 +179,7 @@ const ProfileTypeFormDateSelection: React.FC< return ( <> <div className={'profile-form-container'}> - <ProfileTypeProgress step={step} /> + <FormProgress step={step} formType={'profile'} /> <div className={'profile-question-label'}> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` diff --git a/src/components/ProfileType/ProfileTypeFormMultiChoice.tsx b/src/components/ProfileType/ProfileTypeFormMultiChoice.tsx index 57ea92b703bba66b17ba70319281aed606736593..1df12766cb42d6b4a3b1b95dd6d8711e87df24ca 100644 --- a/src/components/ProfileType/ProfileTypeFormMultiChoice.tsx +++ b/src/components/ProfileType/ProfileTypeFormMultiChoice.tsx @@ -2,8 +2,8 @@ import React, { useCallback, useEffect, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import classNames from 'classnames' -import ProfileTypeProgress from 'components/ProfileType/ProfileTypeProgress' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormProgress from 'components/FormGlobal/FormProgress' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { remove } from 'lodash' import { IndividualInsulationWork, @@ -83,7 +83,7 @@ const ProfileTypeFormMultiChoice: React.FC<ProfileTypeFormMultiChoiceProps> = ({ return ( <> <div className={'profile-form-container'}> - <ProfileTypeProgress step={step} /> + <FormProgress step={step} formType={'profile'} /> <div className={'profile-question-label'}> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` diff --git a/src/components/ProfileType/ProfileTypeFormNumber.tsx b/src/components/ProfileType/ProfileTypeFormNumber.tsx index 18f54f4c4a9e24e30a7fa945aa506625cbd3d685..cdb31f505c0486f66038d2f306191fa189fb69ad 100644 --- a/src/components/ProfileType/ProfileTypeFormNumber.tsx +++ b/src/components/ProfileType/ProfileTypeFormNumber.tsx @@ -1,8 +1,8 @@ import React, { useCallback, useEffect, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import ProfileTypeProgress from 'components/ProfileType/ProfileTypeProgress' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormProgress from 'components/FormGlobal/FormProgress' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { ProfileTypeStepForm } from 'enum/profileType.enum' import { ProfileType, @@ -50,7 +50,7 @@ const ProfileTypeFormNumber: React.FC<ProfileTypeFormNumberProps> = ({ return ( <> <div className={'profile-form-container'}> - <ProfileTypeProgress step={step} /> + <FormProgress step={step} formType={'profile'} /> <div className={'profile-question-label'}> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` diff --git a/src/components/ProfileType/ProfileTypeFormNumberSelection.tsx b/src/components/ProfileType/ProfileTypeFormNumberSelection.tsx index 2979bb1723adb28a352f9b91c58f07acaf327500..8996894ac4a871f2d4d3b3a7653edbe4f4dd07a2 100644 --- a/src/components/ProfileType/ProfileTypeFormNumberSelection.tsx +++ b/src/components/ProfileType/ProfileTypeFormNumberSelection.tsx @@ -1,8 +1,8 @@ import React, { useCallback, useEffect, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import ProfileTypeProgress from 'components/ProfileType/ProfileTypeProgress' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormProgress from 'components/FormGlobal/FormProgress' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { ProfileTypeStepForm } from 'enum/profileType.enum' import { ProfileType, @@ -69,7 +69,7 @@ const ProfileTypeFormNumberSelection: React.FC< return ( <> <div className={'profile-form-container'}> - <ProfileTypeProgress step={step} /> + <FormProgress step={step} formType={'profile'} /> <div className={'profile-question-label'}> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` diff --git a/src/components/ProfileType/ProfileTypeFormSingleChoice.tsx b/src/components/ProfileType/ProfileTypeFormSingleChoice.tsx index d39461b166bd3daaa16cc94b1ad251a615a9b90b..f1ddbe33c72c1367d83a46cc5ea65404655176fa 100644 --- a/src/components/ProfileType/ProfileTypeFormSingleChoice.tsx +++ b/src/components/ProfileType/ProfileTypeFormSingleChoice.tsx @@ -2,8 +2,8 @@ import React, { useCallback, useEffect, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import classNames from 'classnames' -import ProfileTypeProgress from 'components/ProfileType/ProfileTypeProgress' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormProgress from 'components/FormGlobal/FormProgress' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { ProfileTypeStepForm } from 'enum/profileType.enum' import { ProfileType, @@ -53,7 +53,7 @@ const ProfileTypeFormSingleChoice: React.FC< return ( <> <div className={'profile-form-container'}> - <ProfileTypeProgress step={step} /> + <FormProgress step={step} formType={'profile'} /> <div className={'profile-question-label'}> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` diff --git a/src/components/Routes/Routes.tsx b/src/components/Routes/Routes.tsx index 0df72fa29592f663f831c2fd2a2e6a36f54200cf..de8fee76c7dfc1aa21095784ac787a7c6714117a 100644 --- a/src/components/Routes/Routes.tsx +++ b/src/components/Routes/Routes.tsx @@ -11,6 +11,7 @@ import TermsView from 'components/Terms/TermsView' import { TermsStatus } from 'models' import EcogestureFormView from 'components/EcogestureForm/EcogestureFormView' import EcogestureSelection from 'components/EcogestureSelection/EcogestureSelection' +import SgeConnectView from 'components/Connection/SGEConnect/SgeConnectView' const ConsumptionView = lazy(() => import('components/Home/ConsumptionView')) @@ -59,6 +60,7 @@ const Routes: React.FC<RouteProps> = ({ termsStatus }: RouteProps) => { <ConsumptionView fluidType={FluidType.MULTIFLUID} /> </Route> + <Route path={`/sge-connect`} component={SgeConnectView} /> <Route path={`/challenges/duel`} component={DuelView} /> <Route path={`/challenges/quiz`} component={QuizView} /> <Route path={`/challenges/exploration`} component={ExplorationView} /> diff --git a/src/components/Terms/termsView.scss b/src/components/Terms/termsView.scss index 580e95b0505d7a383ec832c13459ffe26d29a151..e7ccf1b1656d98024398c8d07b2d8ac48e969a5e 100644 --- a/src/components/Terms/termsView.scss +++ b/src/components/Terms/termsView.scss @@ -1,4 +1,5 @@ @import 'src/styles/base/color'; +@import 'src/styles/base/mixins'; .terms-wrapper { padding: 0rem 1.5rem 0 1.5rem; @@ -25,55 +26,8 @@ .dataShare-content-root { width: inherit; } +@include checkBox(); -.checkbox { - margin: 0.5rem 0; - display: flex; - align-items: center; - &:first-of-type { - margin-top: 1.5rem; - } - input { - margin: 0.5rem 1rem 0.5rem 0.5rem; - appearance: none; - -moz-appearance: none; - -webkit-appearance: none; - width: 1.45rem; - height: 1.45rem; - min-width: 1.45rem; - min-height: 1.45rem; - background: $dark-background; - position: relative; - border: solid 2px $gold-shadow; - cursor: pointer; - } -} -.answer-checked { - input { - &:before, - &:after { - content: ''; - position: absolute; - display: inline-block; - background: $gold-shadow; - border-radius: 0.5rem; - } - &:before { - width: 3px; - height: 12px; - left: 10px; - top: 4px; - transform: rotate(41deg); - } - &:after { - width: 3px; - height: 6px; - left: 5px; - top: 8px; - transform: rotate(133deg); - } - } -} .terms-footer { max-width: 45rem; width: 100%; diff --git a/src/constants/config.json b/src/constants/config.json index 490b05a52c0c8270376e9b449a0806e47d8b17a4..581709801bba25a1ea6ed4c852a5c231c656e56f 100644 --- a/src/constants/config.json +++ b/src/constants/config.json @@ -4,13 +4,12 @@ "fluidTypeId": 0, "name": "enedis", "coefficient": 0.174, - "startDate": "2021-08-01T00:00:00.000", "dataDelayOffset": 3, "konnectorConfig": { "name": "Enedis", - "oauth": true, - "slug": "enedisgrandlyon", + "oauth": false, + "slug": "enedis-sge-grandlyon", "siteLink": "https://mon-compte-client.enedis.fr/", "activation": "https://mon-compte-particulier.enedis.fr/donnees/" } diff --git a/src/enum/fluidSlug.enum.ts b/src/enum/fluidSlug.enum.ts index 33db5dcd220a3fba1853921169d00c72e481b614..46404243550a7dde4574bf97b3e9ad2ee944f553 100644 --- a/src/enum/fluidSlug.enum.ts +++ b/src/enum/fluidSlug.enum.ts @@ -1,5 +1,5 @@ export enum FluidSlugType { - ELECTRICITY = 'enedisgrandlyon', + ELECTRICITY = 'enedis-sge-grandlyon', WATER = 'eglgrandlyon', GAS = 'grdfgrandlyon', } diff --git a/src/enum/konnectorError.enum.ts b/src/enum/konnectorError.enum.ts new file mode 100644 index 0000000000000000000000000000000000000000..17411d2a0e1933974511cc809049cd73329631f8 --- /dev/null +++ b/src/enum/konnectorError.enum.ts @@ -0,0 +1,7 @@ +export enum KonnectorError { + LOGIN_FAILED = 'LOGIN_FAILED', + USER_ACTION_NEEDED = 'USER_ACTION_NEEDED', + TERMS_VERSION_MISMATCH = 'TERMS_VERSION_MISMATCH', + UNKNOWN_ERROR = 'UNKNOWN_ERROR', + CRITICAL = 'exit status 1', +} diff --git a/src/enum/sgeStep.enum.ts b/src/enum/sgeStep.enum.ts new file mode 100644 index 0000000000000000000000000000000000000000..393a577799812b4824c8245511559f6ae0d8e30d --- /dev/null +++ b/src/enum/sgeStep.enum.ts @@ -0,0 +1,5 @@ +export enum SgeStep { + IdentityAndPDL, + Address, + Consent, +} diff --git a/src/locales/fr.json b/src/locales/fr.json index 3388e838944e6fcda861a5bbfdae63b34709061c..b73b925db867521b7d72095bb4a632f69d3d88be 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -15,6 +15,7 @@ "title_faq": "FAQ", "title_legal_notice": "Mentions légales", "title_gcu": "CGU", + "title_sge_connect": "Connexion à l'électricité", "accessibility": { "loading": "Chargement" } @@ -135,27 +136,36 @@ "text5": "Cette puissance varie d'un mois à l'autre, regardez cette valeur sur l'ensemble de l'année pour vérifier si votre puissance souscrite correspond bien à votre usage." }, "auth": { - "enedisgrandlyon": { - "connect": { - "label1": "Je me connecte à mon", - "label2": "compte Enedis" - }, - "no_account": { - "title": "Ecolyo doit se connecter à votre compte Enedis", - "subtitle1": "Si vous n’avez pas de compte Enedis", - "button_create_account": "Je crée mon compte Enedis", - "subtitle2": "Si vous avez déjà un compte Enedis,", - "subtitle2_info": "votre accord est nécessaire pour connecter Enedis et Ecolyo", - "info": "Enedis est responsable de votre compteur Linky et en charge de relever vos consommations." + "enedis-sge-grandlyon": { + "title": "Ecolyo doit se connecter à votre compte Enedis", + "bill": "Munissez-vous d’une <span>facture d’électricité</span> pour valider la connexion", + "connect": "Je me connecte à l'électricité", + "accessibility": { + "connect": "Se connecter" }, - "title_with_account": "Votre compte Enedis a bien été créé ?", - "with_account": { - "title": "Votre compte Enedis a bien été créé ?", - "subtitle1": "Plus qu’à donner votre accord pour connecter Enedis et Ecolyo !", - "subtitle2": "Si vous n’avez pas de compte Enedis", - "button_create_account": "Je crée mon compte", - "subtitle2_info": "En cas de soucis pour créer votre compte ou pour vous y connecter, un guide en pas-à -pas est disponible pour vous y aider.", - "button_goto_guide": "Voir le guide" + "identityTitle": "Nom inscrit sur la facture", + "firstName": "Prénom", + "lastName": "Nom", + "pdlTitle": "Numéro de votre compteur électrique (PDL)", + "pdlLabel": "N° (14 chiffes)", + "pdlHint": "Où trouver le n° de PDL ?", + "addressTitle": "Adresse du titulaire", + "address": "Numéro et voie", + "zipCode": "Code postal", + "city": "Ville", + "headConsent": "Vous allez partager vos données à la Métropole de Lyon. Elles seront directement transférées à Ecolyo à l'intérieur de votre cloud personnel, sans que la Métropole n'y accède ni ne les visualise.", + "textConsent": "Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes : ", + "consentLi1": "L'historique et le relevé de vos consommations quotidiennes en kWh", + "consentLi2": "L'historique et le relevé de vos consommations au pas de temps 30 minutes", + "consentLi3": "Les puissances maximales atteintes quotidiennement", + "consentLi4": "Les données contractuelles (début de contrat et puissance souscrite)", + "consentCheck1": "Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un an</span>", + "consentCheck2": "J’atteste être le titulaire du point de livraison (PDL) renseigné à l’étape précédente", + "modalHint": { + "accessibility": "Titre de la modale", + "title": "Où trouver le n° de PDL ?", + "button": "J'ai compris", + "button-accessibility": "Bouton valider" } }, "grdfgrandlyon": { @@ -354,10 +364,10 @@ } }, "last_duel_modal": { - "title": "Félicitations !", - "subtitle": "Vous avez terminé tous les défis !", - "message1": "Nous travaillons actuellement à vous proposer de nouveaux défis.", - "message2": "Vous pouvez donner votre avis sur ce que vous aimeriez en cliquant sur la bulle jaune." + "title": "Félicitations !", + "subtitle": "Vous avez terminé tous les défis !", + "message1": "Nous travaillons actuellement à vous proposer de nouveaux défis.", + "message2": "Vous pouvez donner votre avis sur ce que vous aimeriez en cliquant sur la bulle jaune." }, "duel_empty_value_modal": { "title": "Oups !", @@ -737,6 +747,7 @@ "konnector_modal": { "loading_data": "Veuillez patienter, vos données sont en cours de chargement.", "loading_data_update": "Veuillez patienter, vos données sont en cours de mise à jour.", + "logging_txt": "Nous vérifions vos informations d'identité", "success_txt": "Félicitations !", "success_data_electricity": "Vos données de consommation d'électricité sont maintenant connectées à Ecolyo.", "success_data_water": "Vos données de consommation d'eau sont maintenant connectées à Ecolyo.", @@ -745,9 +756,19 @@ "success_data_update_water": "Vos données de consommation d'eau sont maintenant à jour dans Ecolyo.", "success_data_update_gas": "Vos données de consommation de gaz sont maintenant à jour dans Ecolyo.", "error_txt": "Aïe !", + "no_insee_code": "Il semblerait que votre code postal ne soit pas pris en compte par Ecolyo.", + "no_insee_code_txt": "Ecolyo est un service créé par la Métropole de Lyon et n’est aujourd’hui utilisable que par les habitants du territoire de la Métropôle de Lyon.", + "mismatch": { + "title": "Vos données n'ont pas pu être récupérées.", + "text1": "Vos nom et numéro de compteur ne correspondent plus. Merci de reconfigurer votre connecteur.", + "text2": "Reconfigurer mon connecteur ?", + "text3": "La reconfiguration de votre connecteur passe par sa suppression et sa nouvelle installation. Vos données seront conservées." + }, "error_data_electricity": "Un problème est survenu. Vos données de consommation d’électricité ne seront pas chargées.", "error_data_water": "Un problème est survenu. Vos données de consommation d’eau ne seront pas chargées.", "error_credentials_water": "Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter. L'identifiant est un numéro à 7 chiffres (différent de votre numéro de contrat).", + "error_credentials_electricity": "Vos nom et adresse ne concordent pas avec le numéro de votre compteur.", + "error_credentials_electricity_2": "Nous ne pouvons vous donner accès aux données de consommation.", "error_credentials_update_water": "Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter.", "error_credentials_update_electricity": "Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.", "error_credentials_update_gas": "Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.", @@ -757,6 +778,8 @@ "error_data_update_gas": "Un problème est survenu. Vos données de consommation de gaz n’ont pas été mises à jour.", "error_data_2": "Merci de réessayer plus tard.", "button_validate": "Ok", + "button_understood": "J'ai compris", + "button_come_back_later": "Revenir plus tard", "accessibility": { "window_title": "Fenêtre d'attente de connexion", "button_close": "Fermer la fenêtre" @@ -893,21 +916,6 @@ } }, "partner_connection_steps": { - "electricity": { - "step1": { - "info1": "Munissez-vous d’une <span>facture d’électricité</span> et d’un zeste de patience.", - "info2": "" - }, - "step2": { - "info1": "Si le contrat d’électricité est à votre nom, privilégiez l’identification <span>France connect.</span>", - "info2": "Sinon, munissez-vous de la <span>pièce d’identité du titulaire du contrat.</span>" - }, - "step3": { - "info1": "Une fois votre compte créé, <span>revenez sur Ecolyo</span> pour finaliser la connexion.", - "info2": "" - }, - "button_validate": "Aller sur Enedis" - }, "water": { "step1": { "info1": "Munissez-vous d’une <span>facture d'eau</span> et d’un zeste de patience.", diff --git a/src/migrations/migration.spec.ts b/src/migrations/migration.spec.ts index 3da001c93bff29afdb2c9af86276bb1bfcbd35bb..6bd3a670c4cfdc13c4328222b1eb0c0bf2a47069 100644 --- a/src/migrations/migration.spec.ts +++ b/src/migrations/migration.spec.ts @@ -19,6 +19,7 @@ describe('migration logger', () => { appVersion: '1.2.4', description: 'Removing mailToken from profil', docTypes: PROFILE_DOCTYPE, + releaseNotes: null, run: async (mockClient, docs: any[]): Promise<Profile[]> => { return docs.map(doc => { if (doc.mailToken) { @@ -61,6 +62,7 @@ describe('migration', () => { appVersion: '1.2.4', description: 'Removing mailToken from profil', docTypes: PROFILE_DOCTYPE, + releaseNotes: null, run: async (mockClient, docs: any[]): Promise<Profile[]> => { return docs.map(doc => { if (doc.GCUApprovalDate) { @@ -155,6 +157,7 @@ describe('migration', () => { appVersion: '1.2.4', description: 'Removing mailToken from profil', docTypes: PROFILE_DOCTYPE, + releaseNotes: null, run: async (mockClient, docs: any[]): Promise<Profile[]> => { return [] }, diff --git a/src/migrations/migration.ts b/src/migrations/migration.ts index d3f8b76da7d415214f6cc26360d32b436d03bcca..bf0ee97ec3cb664a4276d2e5e388729bf49bda97 100644 --- a/src/migrations/migration.ts +++ b/src/migrations/migration.ts @@ -168,7 +168,7 @@ export async function migrate( await updateSchemaVersion(_client, migration.targetSchemaVersion) break } - } catch (err) { + } catch (err: any) { console.error(err) result = { type: MIGRATION_RESULT_FAILED, diff --git a/src/migrations/migration.type.ts b/src/migrations/migration.type.ts index 505363b2f1ec2dc3a33e373f3473742fcd48478e..c5d87f581a0c47d93f38cf89f0b9a94fe45b9b79 100644 --- a/src/migrations/migration.type.ts +++ b/src/migrations/migration.type.ts @@ -4,7 +4,7 @@ import { Notes } from 'models/releaseNotes.model' type SchemaVersion = number export type MigrationData = { - errors: string[] + errors: any[] } export interface MigrationNoop extends MigrationData { type: 'MigrationNoop' diff --git a/src/models/account.model.ts b/src/models/account.model.ts index 0e6ede6d7865eb4c45c99eca0d0e4dd1a64966bf..d3905a953e9915e7022d6705684976f07d190310 100644 --- a/src/models/account.model.ts +++ b/src/models/account.model.ts @@ -3,18 +3,16 @@ export interface Account extends AccountAttributes { id?: string _rev?: string _type?: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any cozyMetadata?: Record<string, any> } export interface AccountAttributes { account_type: string - auth?: AccountAuthData + auth?: AccountAuthData | AccountSgeData oauth?: AccountOAuthData identifier?: string state?: string | null name?: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any oauth_callback_results?: Record<string, any> } @@ -30,3 +28,13 @@ export interface AccountOAuthData { expires_at?: string token_type?: string } + +//Temporary model +export interface AccountSgeData { + pointId: string + address: string + firstname: string + lastname: string + postalCode: string + city: string +} diff --git a/src/models/config.model.ts b/src/models/config.model.ts index 1a20aca95a1aead43e3caa664458385198b2089a..121b79ed624ddec8625dde974c258685585d19d0 100644 --- a/src/models/config.model.ts +++ b/src/models/config.model.ts @@ -1,7 +1,9 @@ +import { FluidSlugType } from 'enum/fluidSlug.enum' + export interface KonnectorConfig { name: string oauth: boolean - slug: string + slug: FluidSlugType cron?: string lastKnownCredentials?: string siteLink: string diff --git a/src/models/global.model.ts b/src/models/global.model.ts index afc5f92b5d4d8e15b44f06699755fa5c901afd3a..71d5bb8dd1935886b3083824457374b47ffbaa61 100644 --- a/src/models/global.model.ts +++ b/src/models/global.model.ts @@ -3,6 +3,7 @@ import { ScreenType } from 'enum/screen.enum' import { TermsStatus } from 'models' import { FluidStatus } from './fluid.model' import { ReleaseNotes } from './releaseNotes.model' +import { SgeStore } from './sgeStore.model' export interface GlobalState { screenType: ScreenType @@ -16,4 +17,5 @@ export interface GlobalState { fluidTypes: FluidType[] openPartnersIssueModal: boolean shouldRefreshConsent: boolean + sgeConnect: SgeStore } diff --git a/src/models/sgeStore.model.ts b/src/models/sgeStore.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..59b30d9f42f3b5e912b4ad5b43838ce240e8f84e --- /dev/null +++ b/src/models/sgeStore.model.ts @@ -0,0 +1,12 @@ +export interface SgeStore { + currentStep: number + firstName: string + lastName: string + pdl: number | null + address: string + zipCode: number | null + city: string + dataConsent: boolean + pdlConfirm: boolean + shouldLaunchAccount: boolean +} diff --git a/src/models/trigger.model.ts b/src/models/trigger.model.ts index a8066eb4d9b971cb526c72eca3fa75b4a6beb064..04b54376c2c37c7cba6d8782745e80078504845f 100644 --- a/src/models/trigger.model.ts +++ b/src/models/trigger.model.ts @@ -4,7 +4,6 @@ export interface Trigger extends TriggerAttributes { prefix?: string debounce?: string options?: string | null - // eslint-disable-next-line @typescript-eslint/no-explicit-any cozyMetadata?: Record<string, any> } diff --git a/src/services/account.service.spec.ts b/src/services/account.service.spec.ts index b2bb202c90164bc13b905d4c0c0cc0a27e7048c0..26eb9eee1f200e121b0641297fced61dc99cb879 100644 --- a/src/services/account.service.spec.ts +++ b/src/services/account.service.spec.ts @@ -86,7 +86,7 @@ describe('Account service', () => { expect(result).toBe(null) }) it('should return the account linked to oldest trigger when several account', async () => { - const mockType = 'enedisgrandlyon' + const mockType = 'enedis-sge-grandlyon' const mockAccounts = accountsData mockAccounts[1].account_type = mockType mockAccounts[2].account_type = mockType @@ -107,7 +107,7 @@ describe('Account service', () => { describe('getAccountsByType method', () => { it('should return all accounts for a type when several account', async () => { - const mockType = 'enedisgrandlyon' + const mockType = 'enedis-sge-grandlyon' const mockAccounts = accountsData mockAccounts[1].account_type = mockType mockAccounts[2].account_type = mockType diff --git a/src/services/account.service.ts b/src/services/account.service.ts index f813c6dfe11a40a5e81f47569dce5b0748224382..4535ba52fa88efc4fb891b4bf29de15c0dee2fba 100644 --- a/src/services/account.service.ts +++ b/src/services/account.service.ts @@ -3,6 +3,7 @@ import { Account, AccountAttributes, AccountAuthData, + AccountSgeData, Konnector, Trigger, } from 'models' @@ -26,14 +27,14 @@ export default class AccountService { private buildAccountAttributes( konnector: Konnector, - authData: AccountAuthData + authData: AccountAuthData | AccountSgeData ): AccountAttributes { return build(konnector, authData) } public async createAccount( konnector: Konnector, - accountAuthData: AccountAuthData + accountAuthData: AccountAuthData | AccountSgeData ): Promise<Account> { const accountAttributes = this.buildAccountAttributes( konnector, @@ -54,9 +55,9 @@ export default class AccountService { public async getAccountByType(type: string): Promise<Account | null> { try { - const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) - // eslint-disable-next-line @typescript-eslint/camelcase - .where({ account_type: type }) + const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE).where({ + account_type: type, + }) // .indexFields(['account_type']) const { data: accounts }: QueryResult<Account[]> = await this._client.query(query) @@ -100,9 +101,9 @@ export default class AccountService { public async getAccountsByType(type: string): Promise<Account[]> { try { - const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) - // eslint-disable-next-line @typescript-eslint/camelcase - .where({ account_type: type }) + const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE).where({ + account_type: type, + }) // .indexFields(['account_type']) const { data: accounts }: QueryResult<Account[]> = await this._client.query(query) @@ -135,7 +136,6 @@ export default class AccountService { public async createIndexAccount(): Promise<[]> { const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) - // eslint-disable-next-line @typescript-eslint/camelcase .where({ account_type: 'index' }) // .indexFields(['account_type']) .limitBy(1) diff --git a/src/services/connection.service.ts b/src/services/connection.service.ts index 5c9a4829dee9dd1e0c090e04f82929c137958605..fb8563366c2a10cc75539b2c8a7b226a5cbd1200 100644 --- a/src/services/connection.service.ts +++ b/src/services/connection.service.ts @@ -1,8 +1,15 @@ import { Client } from 'cozy-client' -import { Account, AccountAuthData, Konnector, Trigger } from 'models' +import { + Account, + AccountAuthData, + AccountSgeData, + Konnector, + Trigger, +} from 'models' import AccountService from 'services/account.service' import TriggerService from 'services/triggers.service' import KonnectorService from 'services/konnector.service' +import { SgeStore } from 'models/sgeStore.model' export default class ConnectionService { private _client: Client @@ -13,8 +20,8 @@ export default class ConnectionService { public async connectNewUser( konnectorId: string, - login: string, - password: string + eglAuthData?: AccountAuthData, + sgeAuthData?: SgeStore ): Promise<{ account: Account; trigger: Trigger }> { // Retrieve konnector const konnectorService = new KonnectorService(this._client) @@ -25,9 +32,22 @@ export default class ConnectionService { throw new Error(`Could not find konnector for ${konnectorId}`) } // Creation of the account linked to the konnector retrieved - const accountAuthData: AccountAuthData = { - login: login, - password: password, + let accountAuthData: AccountAuthData | AccountSgeData + if (eglAuthData) { + accountAuthData = { + login: eglAuthData.login, + password: eglAuthData.password, + } as AccountAuthData + } else { + // No login and password for Sge account + accountAuthData = { + pointId: sgeAuthData?.pdl ? sgeAuthData.pdl.toString() : '', + firstname: sgeAuthData?.firstName, + lastname: sgeAuthData?.lastName, + address: sgeAuthData?.address, + postalCode: sgeAuthData?.zipCode ? sgeAuthData.zipCode.toString() : '', + city: sgeAuthData?.city, + } as AccountSgeData } const accountService = new AccountService(this._client) const account: Account = await accountService.createAccount( diff --git a/src/services/fluid.service.spec.ts b/src/services/fluid.service.spec.ts index 062014b5cbe5f7212079f08311af489529e39fb9..e20c2f3fec6fe82f5afa41a1e64ab84f916a3f38 100644 --- a/src/services/fluid.service.spec.ts +++ b/src/services/fluid.service.spec.ts @@ -93,8 +93,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedis-sge-grandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -179,8 +179,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedis-sge-grandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -265,8 +265,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedis-sge-grandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -351,8 +351,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedis-sge-grandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -438,8 +438,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedis-sge-grandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -533,8 +533,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedis-sge-grandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -567,8 +567,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedis-sge-grandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -601,8 +601,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedis-sge-grandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -635,8 +635,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedis-sge-grandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -673,8 +673,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedis-sge-grandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -730,8 +730,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedis-sge-grandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, diff --git a/src/services/konnector.service.spec.ts b/src/services/konnector.service.spec.ts index f5c683ac4c29066aa7441d0065f97c33a9e29797..053c06e2de7a3aef9287170768d20050d16f08e9 100644 --- a/src/services/konnector.service.spec.ts +++ b/src/services/konnector.service.spec.ts @@ -30,7 +30,7 @@ describe('KonnectorService service', () => { skip: 0, } mockClient.query.mockResolvedValueOnce(mockQueryResult) - const result = await konnectorService.getKonnector('enedisgrandlyon') + const result = await konnectorService.getKonnector('enedis-sge-grandlyon') expect(result).toEqual(konnectorsData[0]) }) @@ -42,7 +42,7 @@ describe('KonnectorService service', () => { skip: 0, } mockClient.query.mockResolvedValueOnce(mockQueryResult) - const result = await konnectorService.getKonnector('enedisgrandlyon') + const result = await konnectorService.getKonnector('enedis-sge-grandlyon') expect(result).toBeNull() }) }) diff --git a/src/store/global/global.actions.ts b/src/store/global/global.actions.ts index 294d00f0a458c5eb7156ac7377d99f8cc3799b5a..838a477930a5ea6ad08b7b29749b96cb9a46e87b 100644 --- a/src/store/global/global.actions.ts +++ b/src/store/global/global.actions.ts @@ -2,6 +2,7 @@ import { FluidType } from 'enum/fluid.enum' import { ScreenType } from 'enum/screen.enum' import { FluidConnection, FluidStatus, TermsStatus } from 'models' import { Notes } from 'models/releaseNotes.model' +import { SgeStore } from 'models/sgeStore.model' export const CHANGE_SCREEN_TYPE = 'CHANGE_SCREEN_TYPE' export const SHOW_RELEASE_NOTES = 'SHOW_RELEASE_NOTES' @@ -17,6 +18,7 @@ export const UPDATE_FLUID_CONNECTION = 'UPDATE_FLUID_CONNECTION' export const UPDATE_TERMS_VALIDATION = 'UPDATE_TERMS_VALIDATION' export const SET_PARTNERS_ISSUE = 'SET_PARTNERS_ISSUE' export const SET_SHOULD_REFRESH_CONSENT = 'SET_SHOULD_REFRESH_CONSENT' +export const UPDATE_SGE_CONNECT = 'UPDATE_SGE_CONNECT' interface ChangeScreenType { type: typeof CHANGE_SCREEN_TYPE payload?: ScreenType @@ -71,6 +73,10 @@ interface SetShouldRefreshConsent { type: typeof SET_SHOULD_REFRESH_CONSENT payload?: boolean } +interface UpdateSGEConnect { + type: typeof UPDATE_SGE_CONNECT + payload?: SgeStore +} export type GlobalActionTypes = | ChangeScreenType @@ -84,6 +90,7 @@ export type GlobalActionTypes = | ShowReleaseNotes | SetPartnersIssue | SetShouldRefreshConsent + | UpdateSGEConnect export function changeScreenType(screenType: ScreenType): GlobalActionTypes { return { @@ -177,3 +184,10 @@ export function setShouldRefreshConsent( payload: shouldRefreshConsent, } } + +export function updateSgeStore(sgeStore: SgeStore): GlobalActionTypes { + return { + type: UPDATE_SGE_CONNECT, + payload: sgeStore, + } +} diff --git a/src/store/global/global.reducer.spec.ts b/src/store/global/global.reducer.spec.ts index 23cb3d1d1343eef67f175990ec2a368c0bfa059c..03b3919361f0927ecb5b6d82bcdd148bed325d98 100644 --- a/src/store/global/global.reducer.spec.ts +++ b/src/store/global/global.reducer.spec.ts @@ -30,7 +30,6 @@ const mockDataDates: (DateTime | null)[] = [ describe('global reducer', () => { it('should return the initial state', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any const result = globalReducer(undefined as any, { type: 'default' }) expect(result).toEqual(mockInitialGlobalState) }) @@ -142,7 +141,7 @@ describe('global reducer', () => { konnectorConfig: { name: 'Enedis', oauth: true, - slug: 'enedisgrandlyon', + slug: 'enedis-sge-grandlyon', siteLink: 'https://mon-compte-particulier.enedis.fr/donnees/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, diff --git a/src/store/global/global.reducer.ts b/src/store/global/global.reducer.ts index 143410b6af1e659743062bf72b53a20353230365..8f897c2380eede3d1c162ed551cdc301f1bfb854 100644 --- a/src/store/global/global.reducer.ts +++ b/src/store/global/global.reducer.ts @@ -12,10 +12,12 @@ import { SHOW_RELEASE_NOTES, SET_PARTNERS_ISSUE, SET_SHOULD_REFRESH_CONSENT, + UPDATE_SGE_CONNECT, } from 'store/global/global.actions' import { FluidStatus, GlobalState } from 'models' import { ScreenType } from 'enum/screen.enum' import { FluidState, FluidType } from 'enum/fluid.enum' +import { FluidSlugType } from 'enum/fluidSlug.enum' const initialState: GlobalState = { screenType: ScreenType.MOBILE, @@ -52,7 +54,7 @@ const initialState: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.ELECTRICITY, siteLink: '', activation: '', }, @@ -73,7 +75,7 @@ const initialState: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.WATER, siteLink: '', activation: '', }, @@ -94,7 +96,7 @@ const initialState: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.GAS, siteLink: '', activation: '', }, @@ -104,6 +106,18 @@ const initialState: GlobalState = { fluidTypes: [], openPartnersIssueModal: false, shouldRefreshConsent: false, + sgeConnect: { + currentStep: 0, + firstName: '', + lastName: '', + pdl: null, + address: '', + zipCode: null, + city: '', + dataConsent: false, + pdlConfirm: false, + shouldLaunchAccount: false, + }, } const getFluidTypesFromStatus = (fluidStatus: FluidStatus[]): FluidType[] => { @@ -215,7 +229,13 @@ export const globalReducer: Reducer<GlobalState> = ( } else { return state } - + case UPDATE_SGE_CONNECT: + if (action.payload != undefined) + return { + ...state, + sgeConnect: action.payload, + } + return state default: return state } diff --git a/src/store/index.ts b/src/store/index.ts index 670d74d464eb86d305f3c090be9a50072285d95c..b8b4b1e9bab40858d111966aa65880d517a4dee8 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ import { createStore, combineReducers, diff --git a/src/store/profileType/profileType.reducer.spec.ts b/src/store/profileType/profileType.reducer.spec.ts index 243bcce57f6be41cbc2aa8e6622ad4435352d7c8..ac723528428d2b3d828d14536b6b01b63b518976 100644 --- a/src/store/profileType/profileType.reducer.spec.ts +++ b/src/store/profileType/profileType.reducer.spec.ts @@ -5,7 +5,6 @@ import { profileTypeData } from '../../../tests/__mocks__/profileType.mock' describe('profile reducer', () => { it('should return the initial state', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any const result = profileTypeReducer(undefined as any, { type: 'default' }) expect(result).toEqual(mockInitialProfileTypeState) }) diff --git a/src/store/profileType/profileType.reducer.ts b/src/store/profileType/profileType.reducer.ts index 95a0dc1937eda85ef6ec8edc0b8295ca2478409c..a5debb195e059fabf8567d50e406887ea45b5c43 100644 --- a/src/store/profileType/profileType.reducer.ts +++ b/src/store/profileType/profileType.reducer.ts @@ -40,6 +40,7 @@ const initialState: ProfileType = { hotWaterFluid: FluidType.ELECTRICITY, cookingFluid: FluidType.ELECTRICITY, updateDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + equipments: [], } export const profileTypeReducer: Reducer<ProfileType> = ( diff --git a/src/styles/base/_color.scss b/src/styles/base/_color.scss index 8e6b7a884acf9aa1f24c963438205008fb903821..354840a88344a0acb36fdd70c1f98a31b8ab0b8b 100644 --- a/src/styles/base/_color.scss +++ b/src/styles/base/_color.scss @@ -9,7 +9,7 @@ $dark-background: radial-gradient( #2a2b30 0%, #1b1c22 100% ); - +$bottom-bar-grey: #32343d; /** RED **/ $red-primary: #d25959; diff --git a/src/styles/base/_layout.scss b/src/styles/base/_layout.scss index 78f6fb950cceaa5783949454e1b89d4cc1458004..67222d599313dd7193c972075ffd55534f62c78d 100644 --- a/src/styles/base/_layout.scss +++ b/src/styles/base/_layout.scss @@ -3,11 +3,11 @@ @import '../base/z-index'; html { - background: $dark-2; + background: $dark-light-2; } body { - background: $dark-2; + background: $dark-light-2; overflow: unset !important; } @@ -35,7 +35,7 @@ body { [role='banner'] .coz-bar-container { background-color: $white; @media #{$large-phone} { - padding: 0 0 0 0; + padding: 0.6rem 0 0 0; background-color: unset; } } @@ -66,9 +66,9 @@ body { } .header-top { background: radial-gradient( - 74.83% 76.97% at 50% 13.64%, - #343641 0%, - #1b1c22 100% + circle, + rgba(52, 54, 65, 1) 0%, + rgba(27, 28, 34, 1) 100% ); width: 100%; .header-text { diff --git a/src/styles/base/_mixins.scss b/src/styles/base/_mixins.scss index ebfefb8f4bfdc81ef48abd3c0f21ef652aeddc3b..40c36f8691099ad1bba4bcf60d374f515e290a9c 100644 --- a/src/styles/base/_mixins.scss +++ b/src/styles/base/_mixins.scss @@ -25,3 +25,53 @@ cursor: not-allowed; } } +@mixin checkBox() { + .checkbox { + margin: 0.5rem 0; + display: flex; + align-items: center; + &:first-of-type { + margin-top: 1.5rem; + } + input { + margin: 0.5rem 1rem 0.5rem 0.5rem; + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + width: 1.45rem; + height: 1.45rem; + min-width: 1.45rem; + min-height: 1.45rem; + background: $dark-background; + position: relative; + border: solid 2px $gold-shadow; + cursor: pointer; + } + } + .answer-checked { + input { + &:before, + &:after { + content: ''; + position: absolute; + display: inline-block; + background: $gold-shadow; + border-radius: 0.5rem; + } + &:before { + width: 3px; + height: 12px; + left: 10px; + top: 4px; + transform: rotate(41deg); + } + &:after { + width: 3px; + height: 6px; + left: 5px; + top: 8px; + transform: rotate(133deg); + } + } + } +} diff --git a/src/styles/index.css b/src/styles/index.css index 12bc8275f8f7f3920e5f52331cefe9b3d1f9c663..44d1191d8c9a323742926a9cb4039508ea1c66e3 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -14,13 +14,13 @@ /** App colors **/ /** TABS GRADIENT **/ /** SCROLLBAR **/ -@import url('https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap'); +@import url("https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap"); html { - background: #1b1c22; + background: #121212; } body { - background: #1b1c22; + background: #121212; overflow: unset !important; } @@ -41,18 +41,18 @@ body { justify-content: center; margin-left: 0; } -@media only screen and (max-width: 768px) { +@media only screen and (max-width : 768px) { .cozy-bar { margin-left: 1.25rem; } } -[role='banner'] .coz-bar-container { +[role=banner] .coz-bar-container { background-color: #ffffff; } -@media only screen and (max-width: 768px) { - [role='banner'] .coz-bar-container { - padding: 0 0 0 0; +@media only screen and (max-width : 768px) { + [role=banner] .coz-bar-container { + padding: 0.6rem 0 0 0; background-color: unset; } } @@ -81,17 +81,13 @@ body { top: 48px; left: 0; } -@media only screen and (max-width: 768px) { +@media only screen and (max-width : 768px) { .header { top: 0; } } .header .header-top { - background: radial-gradient( - 74.83% 76.97% at 50% 13.64%, - #343641 0%, - #1b1c22 100% - ); + background: radial-gradient(circle, rgb(52, 54, 65) 0%, rgb(27, 28, 34) 100%); width: 100%; } .header .header-top .header-text { @@ -103,12 +99,12 @@ body { display: flex; flex-direction: column; } -@media only screen and (max-width: 1023px) { +@media only screen and (max-width : 1023px) { .header .header-content { margin: 0; } } -@media only screen and (max-width: 768px) { +@media only screen and (max-width : 768px) { .header .header-content { margin: 60px 0 0 0; } @@ -133,7 +129,7 @@ body { .header .header-content .header-content-top .header-back-button { padding: 0 0.75rem; } -@media only screen and (max-width: 768px) { +@media only screen and (max-width : 768px) { .header .header-content .header-content-top .header-text { padding: 0 1rem 1rem 1rem; color: #e0e0e0; @@ -165,18 +161,18 @@ body { margin-top: 1rem; } -[role='main'] { +[role=main] { /* width */ /* Track */ /* Handle */ } -[role='main']::-webkit-scrollbar { +[role=main]::-webkit-scrollbar { width: 10px; } -[role='main']::-webkit-scrollbar-track { +[role=main]::-webkit-scrollbar-track { background: #3e4045; } -[role='main']::-webkit-scrollbar-thumb { +[role=main]::-webkit-scrollbar-thumb { background: #6f7074; } @@ -244,21 +240,12 @@ p { margin-right: 0.8rem; } -.text-10, -.text-10-italic, -.text-10-bold, -.text-10-bold-capitalize, -.text-10-bold-uppercase, -.text-10-normal, -.text-10-normal-150, -.text-10-normal-uppercase { +.text-10, .text-10-italic, .text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase, .text-10-normal, .text-10-normal-150, .text-10-normal-uppercase { font-style: normal; font-size: 0.625rem; line-height: 120%; } -.text-10-normal, -.text-10-normal-150, -.text-10-normal-uppercase { +.text-10-normal, .text-10-normal-150, .text-10-normal-uppercase { font-weight: normal; } .text-10-normal-uppercase { @@ -267,9 +254,7 @@ p { .text-10-normal-150 { line-height: 150%; } -.text-10-bold, -.text-10-bold-capitalize, -.text-10-bold-uppercase { +.text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase { font-weight: 700; } .text-10-bold-uppercase { @@ -283,21 +268,12 @@ p { font-weight: normal; } -.text-14, -.text-14-italic, -.text-14-bold, -.text-14-bold-capitalize, -.text-14-bold-uppercase, -.text-14-normal, -.text-14-normal-150, -.text-14-normal-uppercase { +.text-14, .text-14-italic, .text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase, .text-14-normal, .text-14-normal-150, .text-14-normal-uppercase { font-style: normal; font-size: 0.875rem; line-height: 120%; } -.text-14-normal, -.text-14-normal-150, -.text-14-normal-uppercase { +.text-14-normal, .text-14-normal-150, .text-14-normal-uppercase { font-weight: normal; } .text-14-normal-uppercase { @@ -306,9 +282,7 @@ p { .text-14-normal-150 { line-height: 150%; } -.text-14-bold, -.text-14-bold-capitalize, -.text-14-bold-uppercase { +.text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase { font-weight: 700; } .text-14-bold-uppercase { @@ -322,21 +296,12 @@ p { font-weight: normal; } -.text-15, -.text-15-italic, -.text-15-bold, -.text-15-bold-capitalize, -.text-15-bold-uppercase, -.text-15-normal, -.text-15-normal-150, -.text-15-normal-uppercase { +.text-15, .text-15-italic, .text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase, .text-15-normal, .text-15-normal-150, .text-15-normal-uppercase { font-style: normal; font-size: 0.938rem; line-height: 120%; } -.text-15-normal, -.text-15-normal-150, -.text-15-normal-uppercase { +.text-15-normal, .text-15-normal-150, .text-15-normal-uppercase { font-weight: normal; } .text-15-normal-uppercase { @@ -345,9 +310,7 @@ p { .text-15-normal-150 { line-height: 150%; } -.text-15-bold, -.text-15-bold-capitalize, -.text-15-bold-uppercase { +.text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase { font-weight: 700; } .text-15-bold-uppercase { @@ -361,21 +324,12 @@ p { font-weight: normal; } -.text-16, -.text-16-italic, -.text-16-bold, -.text-16-bold-capitalize, -.text-16-bold-uppercase, -.text-16-normal, -.text-16-normal-150, -.text-16-normal-uppercase { +.text-16, .text-16-italic, .text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase, .text-16-normal, .text-16-normal-150, .text-16-normal-uppercase { font-style: normal; font-size: 1rem; line-height: 120%; } -.text-16-normal, -.text-16-normal-150, -.text-16-normal-uppercase { +.text-16-normal, .text-16-normal-150, .text-16-normal-uppercase { font-weight: normal; } .text-16-normal-uppercase { @@ -384,9 +338,7 @@ p { .text-16-normal-150 { line-height: 150%; } -.text-16-bold, -.text-16-bold-capitalize, -.text-16-bold-uppercase { +.text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase { font-weight: 700; } .text-16-bold-uppercase { @@ -400,21 +352,12 @@ p { font-weight: normal; } -.text-18, -.text-18-italic, -.text-18-bold, -.text-18-bold-capitalize, -.text-18-bold-uppercase, -.text-18-normal, -.text-18-normal-150, -.text-18-normal-uppercase { +.text-18, .text-18-italic, .text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase, .text-18-normal, .text-18-normal-150, .text-18-normal-uppercase { font-style: normal; font-size: 1.125rem; line-height: 120%; } -.text-18-normal, -.text-18-normal-150, -.text-18-normal-uppercase { +.text-18-normal, .text-18-normal-150, .text-18-normal-uppercase { font-weight: normal; } .text-18-normal-uppercase { @@ -423,9 +366,7 @@ p { .text-18-normal-150 { line-height: 150%; } -.text-18-bold, -.text-18-bold-capitalize, -.text-18-bold-uppercase { +.text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase { font-weight: 700; } .text-18-bold-uppercase { @@ -439,21 +380,12 @@ p { font-weight: normal; } -.text-19, -.text-19-italic, -.text-19-bold, -.text-19-bold-capitalize, -.text-19-bold-uppercase, -.text-19-normal, -.text-19-normal-150, -.text-19-normal-uppercase { +.text-19, .text-19-italic, .text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase, .text-19-normal, .text-19-normal-150, .text-19-normal-uppercase { font-style: normal; font-size: 1.188rem; line-height: 120%; } -.text-19-normal, -.text-19-normal-150, -.text-19-normal-uppercase { +.text-19-normal, .text-19-normal-150, .text-19-normal-uppercase { font-weight: normal; } .text-19-normal-uppercase { @@ -462,9 +394,7 @@ p { .text-19-normal-150 { line-height: 150%; } -.text-19-bold, -.text-19-bold-capitalize, -.text-19-bold-uppercase { +.text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase { font-weight: 700; } .text-19-bold-uppercase { @@ -478,21 +408,12 @@ p { font-weight: normal; } -.text-20, -.text-20-italic, -.text-20-bold, -.text-20-bold-capitalize, -.text-20-bold-uppercase, -.text-20-normal, -.text-20-normal-150, -.text-20-normal-uppercase { +.text-20, .text-20-italic, .text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase, .text-20-normal, .text-20-normal-150, .text-20-normal-uppercase { font-style: normal; font-size: 1.25rem; line-height: 120%; } -.text-20-normal, -.text-20-normal-150, -.text-20-normal-uppercase { +.text-20-normal, .text-20-normal-150, .text-20-normal-uppercase { font-weight: normal; } .text-20-normal-uppercase { @@ -501,9 +422,7 @@ p { .text-20-normal-150 { line-height: 150%; } -.text-20-bold, -.text-20-bold-capitalize, -.text-20-bold-uppercase { +.text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase { font-weight: 700; } .text-20-bold-uppercase { @@ -517,21 +436,12 @@ p { font-weight: normal; } -.text-21, -.text-21-italic, -.text-21-bold, -.text-21-bold-capitalize, -.text-21-bold-uppercase, -.text-21-normal, -.text-21-normal-150, -.text-21-normal-uppercase { +.text-21, .text-21-italic, .text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase, .text-21-normal, .text-21-normal-150, .text-21-normal-uppercase { font-style: normal; font-size: 1.313rem; line-height: 120%; } -.text-21-normal, -.text-21-normal-150, -.text-21-normal-uppercase { +.text-21-normal, .text-21-normal-150, .text-21-normal-uppercase { font-weight: normal; } .text-21-normal-uppercase { @@ -540,9 +450,7 @@ p { .text-21-normal-150 { line-height: 150%; } -.text-21-bold, -.text-21-bold-capitalize, -.text-21-bold-uppercase { +.text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase { font-weight: 700; } .text-21-bold-uppercase { @@ -556,21 +464,12 @@ p { font-weight: normal; } -.text-22, -.text-22-italic, -.text-22-bold, -.text-22-bold-capitalize, -.text-22-bold-uppercase, -.text-22-normal, -.text-22-normal-150, -.text-22-normal-uppercase { +.text-22, .text-22-italic, .text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase, .text-22-normal, .text-22-normal-150, .text-22-normal-uppercase { font-style: normal; font-size: 1.375rem; line-height: 120%; } -.text-22-normal, -.text-22-normal-150, -.text-22-normal-uppercase { +.text-22-normal, .text-22-normal-150, .text-22-normal-uppercase { font-weight: normal; } .text-22-normal-uppercase { @@ -579,9 +478,7 @@ p { .text-22-normal-150 { line-height: 150%; } -.text-22-bold, -.text-22-bold-capitalize, -.text-22-bold-uppercase { +.text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase { font-weight: 700; } .text-22-bold-uppercase { @@ -595,115 +492,68 @@ p { font-weight: normal; } -.text-24, -.text-24-italic, -.text-24-bold, -.text-24-bold-capitalize, -.text-24-bold-uppercase, -.text-24-normal, -.text-24-normal-150, -.text-24-normal-uppercase { +.text-24, .text-24-italic, .text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase, .text-24-normal, .text-24-normal-150, .text-24-normal-uppercase { font-style: normal; font-size: 1.5rem; line-height: 120%; } -/* line 52, src/styles/base/_typography.scss */ -.text-24-normal, -.text-24-normal-uppercase, -.text-24-normal-150 { +.text-24-normal, .text-24-normal-150, .text-24-normal-uppercase { font-weight: normal; } -/* line 55, src/styles/base/_typography.scss */ .text-24-normal-uppercase { text-transform: uppercase; } -/* line 59, src/styles/base/_typography.scss */ .text-24-normal-150 { line-height: 150%; } -/* line 64, src/styles/base/_typography.scss */ -.text-24-bold, -.text-24-bold-uppercase, -.text-24-bold-capitalize { +.text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase { font-weight: 700; } -/* line 67, src/styles/base/_typography.scss */ .text-24-bold-uppercase { text-transform: uppercase; } -/* line 71, src/styles/base/_typography.scss */ .text-24-bold-capitalize { text-transform: capitalize; } -/* line 76, src/styles/base/_typography.scss */ .text-24-italic { font-style: italic; font-weight: normal; } -/* line 48, src/styles/base/_typography.scss */ -.text-26, -.text-26-normal, -.text-26-normal-uppercase, -.text-26-normal-150, -.text-26-bold, -.text-26-bold-uppercase, -.text-26-bold-capitalize, -.text-26-italic { +.text-26, .text-26-italic, .text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase, .text-26-normal, .text-26-normal-150, .text-26-normal-uppercase { font-style: normal; font-size: 1.625rem; line-height: 120%; } -/* line 52, src/styles/base/_typography.scss */ -.text-26-normal, -.text-26-normal-uppercase, -.text-26-normal-150 { +.text-26-normal, .text-26-normal-150, .text-26-normal-uppercase { font-weight: normal; } -/* line 55, src/styles/base/_typography.scss */ .text-26-normal-uppercase { text-transform: uppercase; } -/* line 59, src/styles/base/_typography.scss */ .text-26-normal-150 { line-height: 150%; } -/* line 64, src/styles/base/_typography.scss */ -.text-26-bold, -.text-26-bold-uppercase, -.text-26-bold-capitalize { +.text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase { font-weight: 700; } -/* line 67, src/styles/base/_typography.scss */ .text-26-bold-uppercase { text-transform: uppercase; } -/* line 71, src/styles/base/_typography.scss */ .text-26-bold-capitalize { text-transform: capitalize; } -/* line 76, src/styles/base/_typography.scss */ .text-26-italic { font-style: italic; font-weight: normal; } -/* line 48, src/styles/base/_typography.scss */ -.text-28, -.text-28-normal, -.text-28-normal-uppercase, -.text-28-normal-150, -.text-28-bold, -.text-28-bold-uppercase, -.text-28-bold-capitalize, -.text-28-italic { +.text-28, .text-28-italic, .text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase, .text-28-normal, .text-28-normal-150, .text-28-normal-uppercase { font-style: normal; font-size: 1.75rem; line-height: 120%; } -.text-28-normal, -.text-28-normal-150, -.text-28-normal-uppercase { +.text-28-normal, .text-28-normal-150, .text-28-normal-uppercase { font-weight: normal; } .text-28-normal-uppercase { @@ -712,9 +562,7 @@ p { .text-28-normal-150 { line-height: 150%; } -.text-28-bold, -.text-28-bold-capitalize, -.text-28-bold-uppercase { +.text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase { font-weight: 700; } .text-28-bold-uppercase { @@ -728,21 +576,12 @@ p { font-weight: normal; } -.text-36, -.text-36-italic, -.text-36-bold, -.text-36-bold-capitalize, -.text-36-bold-uppercase, -.text-36-normal, -.text-36-normal-150, -.text-36-normal-uppercase { +.text-36, .text-36-italic, .text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase, .text-36-normal, .text-36-normal-150, .text-36-normal-uppercase { font-style: normal; font-size: 2.25rem; line-height: 120%; } -.text-36-normal, -.text-36-normal-150, -.text-36-normal-uppercase { +.text-36-normal, .text-36-normal-150, .text-36-normal-uppercase { font-weight: normal; } .text-36-normal-uppercase { @@ -751,9 +590,7 @@ p { .text-36-normal-150 { line-height: 150%; } -.text-36-bold, -.text-36-bold-capitalize, -.text-36-bold-uppercase { +.text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase { font-weight: 700; } .text-36-bold-uppercase { @@ -821,7 +658,7 @@ p { font-size: 1rem; line-height: 120%; } -@media only screen and (max-width: 768px) { +@media only screen and (max-width : 768px) { .chart-ticks-x-text { font-size: 0.685rem; } @@ -834,7 +671,7 @@ p { font-size: 0.9rem; line-height: 120%; } -@media only screen and (max-width: 768px) { +@media only screen and (max-width : 768px) { .chart-ticks-y-text { font-size: 0.75rem; } @@ -1168,12 +1005,7 @@ p { /** TABS GRADIENT **/ /** SCROLLBAR **/ button.btn-highlight { - background: radial-gradient( - 105.25% 64.58% at 49.68% 70.83%, - rgba(226, 137, 4, 0.5) 0%, - rgba(255, 255, 255, 0) 100% - ), - #f1c017; + background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017; background-color: #e3b82a; border: none; border-radius: 2px; @@ -1185,10 +1017,7 @@ button.btn-highlight { button.btn-highlight span:first-child { color: #000000; } -button.btn-highlight:hover, -button.btn-highlight:focus, -button.btn-highlight.active, -button.btn-highlight:disabled { +button.btn-highlight:hover, button.btn-highlight:focus, button.btn-highlight.active, button.btn-highlight:disabled { background-color: #b89318; } button.btn-highlight:disabled { @@ -1207,16 +1036,10 @@ button.btn-primary-positive { button.btn-primary-positive span:first-child { color: #e3b82a; } -button.btn-primary-positive:hover, -button.btn-primary-positive:focus, -button.btn-primary-positive.active, -button.btn-primary-positive:disabled { +button.btn-primary-positive:hover, button.btn-primary-positive:focus, button.btn-primary-positive.active, button.btn-primary-positive:disabled { background-color: rgba(18, 18, 18, 0.2); } -button.btn-primary-positive:hover span:first-child, -button.btn-primary-positive:focus span:first-child, -button.btn-primary-positive.active span:first-child, -button.btn-primary-positive:disabled span:first-child { +button.btn-primary-positive:hover span:first-child, button.btn-primary-positive:focus span:first-child, button.btn-primary-positive.active span:first-child, button.btn-primary-positive:disabled span:first-child { color: rgba(227, 184, 42, 0.7); } button.btn-primary-positive:disabled { @@ -1235,16 +1058,10 @@ button.btn-primary-negative { button.btn-primary-negative span:first-child { color: #e3b82a; } -button.btn-primary-negative:hover, -button.btn-primary-negative:focus, -button.btn-primary-negative.active, -button.btn-primary-negative:disabled { +button.btn-primary-negative:hover, button.btn-primary-negative:focus, button.btn-primary-negative.active, button.btn-primary-negative:disabled { background-color: rgba(123, 123, 123, 0.2); } -button.btn-primary-negative:hover span:first-child, -button.btn-primary-negative:focus span:first-child, -button.btn-primary-negative.active span:first-child, -button.btn-primary-negative:disabled span:first-child { +button.btn-primary-negative:hover span:first-child, button.btn-primary-negative:focus span:first-child, button.btn-primary-negative.active span:first-child, button.btn-primary-negative:disabled span:first-child { color: rgba(227, 184, 42, 0.7); } button.btn-primary-negative:disabled { @@ -1263,16 +1080,10 @@ button.btn-secondary-positive { button.btn-secondary-positive span:first-child { color: #e0e0e0; } -button.btn-secondary-positive:hover, -button.btn-secondary-positive:focus, -button.btn-secondary-positive.active, -button.btn-secondary-positive:disabled { +button.btn-secondary-positive:hover, button.btn-secondary-positive:focus, button.btn-secondary-positive.active, button.btn-secondary-positive:disabled { background-color: rgba(18, 18, 18, 0.2); } -button.btn-secondary-positive:hover span:first-child, -button.btn-secondary-positive:focus span:first-child, -button.btn-secondary-positive.active span:first-child, -button.btn-secondary-positive:disabled span:first-child { +button.btn-secondary-positive:hover span:first-child, button.btn-secondary-positive:focus span:first-child, button.btn-secondary-positive.active span:first-child, button.btn-secondary-positive:disabled span:first-child { color: rgba(224, 224, 224, 0.7); } button.btn-secondary-positive:disabled { @@ -1291,16 +1102,10 @@ button.btn-secondary-negative { button.btn-secondary-negative span:first-child { color: #e0e0e0; } -button.btn-secondary-negative:hover, -button.btn-secondary-negative:focus, -button.btn-secondary-negative.active, -button.btn-secondary-negative:disabled { +button.btn-secondary-negative:hover, button.btn-secondary-negative:focus, button.btn-secondary-negative.active, button.btn-secondary-negative:disabled { background-color: rgba(123, 123, 123, 0.2); } -button.btn-secondary-negative:hover span:first-child, -button.btn-secondary-negative:focus span:first-child, -button.btn-secondary-negative.active span:first-child, -button.btn-secondary-negative:disabled span:first-child { +button.btn-secondary-negative:hover span:first-child, button.btn-secondary-negative:focus span:first-child, button.btn-secondary-negative.active span:first-child, button.btn-secondary-negative:disabled span:first-child { color: rgba(224, 224, 224, 0.7); } button.btn-secondary-negative:disabled { @@ -1319,10 +1124,7 @@ button.btn-duel-off { button.btn-duel-off span:first-child { color: #ffffff; } -button.btn-duel-off:hover, -button.btn-duel-off:focus, -button.btn-duel-off.active, -button.btn-duel-off:disabled { +button.btn-duel-off:hover, button.btn-duel-off:focus, button.btn-duel-off.active, button.btn-duel-off:disabled { background-color: black; } button.btn-duel-off:disabled { @@ -1341,21 +1143,14 @@ button.btn-duel-active { button.btn-duel-active span:first-child { color: #121212; } -button.btn-duel-active:hover, -button.btn-duel-active:focus, -button.btn-duel-active.active, -button.btn-duel-active:disabled { +button.btn-duel-active:hover, button.btn-duel-active:focus, button.btn-duel-active.active, button.btn-duel-active:disabled { background-color: #00bebe; } button.btn-duel-active:disabled { cursor: not-allowed; } button.btn-duel-on { - background: radial-gradient( - 60.65% 30.62% at 50% 3.13%, - #2a2b30 0%, - #1b1c22 100% - ); + background: radial-gradient(60.65% 30.62% at 50% 3.13%, #2a2b30 0%, #1b1c22 100%); background-color: #121212; border: 1px solid #58ffff; border-radius: 2px; @@ -1367,22 +1162,14 @@ button.btn-duel-on { button.btn-duel-on span:first-child { color: #ffffff; } -button.btn-duel-on:hover, -button.btn-duel-on:focus, -button.btn-duel-on.active, -button.btn-duel-on:disabled { +button.btn-duel-on:hover, button.btn-duel-on:focus, button.btn-duel-on.active, button.btn-duel-on:disabled { background-color: black; } button.btn-duel-on:disabled { cursor: not-allowed; } button.btn-profile-next { - background: radial-gradient( - 105.25% 64.58% at 49.68% 70.83%, - rgba(226, 137, 4, 0.5) 0%, - rgba(255, 255, 255, 0) 100% - ), - #f1c017; + background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017; background-color: #e3b82a; border: none; border-radius: 2px; @@ -1394,10 +1181,7 @@ button.btn-profile-next { button.btn-profile-next span:first-child { color: #000000; } -button.btn-profile-next:hover, -button.btn-profile-next:focus, -button.btn-profile-next.active, -button.btn-profile-next:disabled { +button.btn-profile-next:hover, button.btn-profile-next:focus, button.btn-profile-next.active, button.btn-profile-next:disabled { background-color: #b89318; } button.btn-profile-next:disabled { @@ -1440,11 +1224,7 @@ button.btn-profile-back:disabled { padding: 16px; } .card:hover { - background: linear-gradient( - 180deg, - rgba(70, 71, 77, 0.7) 0%, - rgba(57, 58, 63, 0.7) 100% - ); + background: linear-gradient(180deg, rgba(70, 71, 77, 0.7) 0%, rgba(57, 58, 63, 0.7) 100%); } .card.rich-card { padding: 24px 16px; @@ -1478,13 +1258,13 @@ div.modal-paper { align-items: center; color: #ffffff; } -@media only screen and (max-width: 1023px) { +@media only screen and (max-width : 1023px) { div.modal-paper { width: 35rem; margin: 0; } } -@media only screen and (max-width: 768px) { +@media only screen and (max-width : 768px) { div.modal-paper { padding: 1rem; width: 85%; @@ -1498,6 +1278,9 @@ div.modal-paper.no-padding { div.modal-paper.blue-border { border: 1px solid rgba(88, 255, 255, 0.2509803922); } +div.modal-paper.blue-light-border { + border: 1px solid #61f0f2; +} div.modal-paper.yellow-border { border: 1px solid rgba(227, 184, 42, 0.4); } @@ -1630,23 +1413,9 @@ a.MuiTypography-colorPrimary { :root { --blue: #58ffff; --blue40: rgba(88, 255, 255, 0.2509803922); - --blueBackground: radial-gradient( - 105.25% 64.58% at 49.68% 70.83%, - rgba(1, 153, 163, 0.5) 0%, - rgba(255, 255, 255, 0) 100% - ), - #58ffff; - --blueRadialGradient: radial-gradient( - 105.25% 64.58% at 49.68% 70.83%, - rgba(1, 153, 163, 0.5) 0%, - rgba(255, 255, 255, 0) 100% - ), - #58ffff; - --blueRadialGradientTrans: radial-gradient( - circle, - #58ffff 0%, - rgba(255, 255, 255, 0) 100% - ); + --blueBackground: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff; + --blueRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff; + --blueRadialGradientTrans: radial-gradient(circle, #58ffff 0%, rgba(255, 255, 255, 0) 100%); --elecColor: #d87b39; --elecColor40: rgba(216, 123, 57, 0.4); --elecCompareColor: #e2bca1; @@ -1666,55 +1435,15 @@ a.MuiTypography-colorPrimary { --darkLight: #25262b; --darkLight2: #121212; --textFont: Lato, sans-serif; - --greyLinearGradientBackground: linear-gradient( - 180deg, - rgb(50, 51, 57) 0%, - rgb(37, 38, 43) 100% - ); - --multiColorRadialGradientTrans: radial-gradient( - circle, - #e3b82a 0%, - rgba(255, 255, 255, 0) 100% - ); - --elecColorRadialGradientTrans: radial-gradient( - circle, - #d87b39 0%, - rgba(255, 255, 255, 0) 100% - ); - --waterColorRadialGradientTrans: radial-gradient( - circle, - #3a98ec 0%, - rgba(255, 255, 255, 0) 100% - ); - --gasColorRadialGradientTrans: radial-gradient( - circle, - #e3b82a 0%, - rgba(255, 255, 255, 0) 100% - ); - --multiColorRadialGradient: radial-gradient( - 105.25% 64.58% at 49.68% 70.83%, - rgba(226, 137, 4, 0.5) 0%, - rgba(255, 255, 255, 0) 100% - ), - #f1c017; - --elecColorRadialGradient: radial-gradient( - 105.25% 64.58% at 49.68% 70.83%, - rgba(158, 67, 2, 0.5) 0%, - rgba(255, 255, 255, 0) 100% - ), - #d87b39; - --gasColorRadialGradient: radial-gradient( - 105.25% 64.58% at 49.68% 70.83%, - rgba(4, 106, 88, 0.5) 0%, - rgba(255, 255, 255, 0) 100% - ), - #45d1b8; - --waterColorRadialGradient: radial-gradient( - 105.25% 64.58% at 49.68% 70.83%, - rgba(2, 93, 174, 0.5) 0%, - rgba(255, 255, 255, 0) 100% - ), - #3a98ec; + --greyLinearGradientBackground: linear-gradient(180deg, rgb(50, 51, 57) 0%, rgb(37, 38, 43) 100%); + --multiColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%); + --elecColorRadialGradientTrans: radial-gradient(circle, #d87b39 0%, rgba(255, 255, 255, 0) 100%); + --waterColorRadialGradientTrans: radial-gradient(circle, #3a98ec 0%, rgba(255, 255, 255, 0) 100%); + --gasColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%); + --multiColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017; + --elecColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(158, 67, 2, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #d87b39; + --gasColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(4, 106, 88, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #45d1b8; + --waterColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(2, 93, 174, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #3a98ec; } .application { diff --git a/src/styles/index.css.map b/src/styles/index.css.map index 43e4f91032c182c88b68a4977026db7edd39c0df..159f95e2be3aca6c2c611a33af848742379652b9 100644 --- a/src/styles/index.css.map +++ b/src/styles/index.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["index.scss","base/_color.scss","base/_layout.scss","base/_z-index.scss","base/_typography.scss","base/_typo-variables.scss","components/_barchart.scss","components/_buttons.scss","base/_mixins.scss","components/_card.scss","components/_dialog.scss","components/_expansion-panel.scss","components/_link.scss"],"names":[],"mappings":"AAAA;AACQ;AACR;AACQ;AACR;ACJA;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;ADhIQ;AEZR;EACE,YDHO;;;ACMT;EACE,YDPO;ECQP;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;AACA;EANF;IAOI;;;;AAIJ;EACE,kBDaM;;ACZN;EAFF;IAGI;IACA;;;;AAIJ;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA,SCxDS;EDyDT;EACA;EACA;;AACA;EAVF;IAWI;;;AAEF;EACE;EAKA;;AACA;EACE;EACA,ODvBQ;;AC0BZ;EACE;EACA;EACA;;AACA;EAJF;IAKI;;;AAEF;EAPF;IAQI;;;AAEF;EACE;EACA;;AACA;EACE;;AAEF;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA,ODlDM;;ACoDR;EACE;;AAEF;EACE;IACE;IACA,OD1DI;;EC4DN;IACE;;EAEF;IACE;;;;AAOV;EACE;EACA;EACA;EACA;EACA;EACA;EACA,OD9EY;;AC+EZ;EACE;EACA;EACA;;AAEF;EACE;EACA;;;AAIJ;AACE;AAIA;AAIA;;AAPA;EACE;;AAGF;EACE,YDHc;;ACMhB;EACE,YDNc;;;AAnJlB;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AAhJA;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AG5IA;EACE,aCLU;;;ADQZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE,OHsCU;EGrCV,aChBU;;;ADmBZ;EACE;EACA,aCrBU;EDsBV;EACA;EACA;EACA;;;AAGF;EACE,aC7BU;ED8BV;EACA;EACA;EACA;EAEA;EACA;EACA,OHeY;EGdZ;;;AAEF;EACE,OHtBY;EGuBZ;EACA;;;AAIA;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;E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","file":"index.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["index.scss","base/_color.scss","base/_layout.scss","base/_z-index.scss","base/_typography.scss","base/_typo-variables.scss","components/_barchart.scss","components/_buttons.scss","base/_mixins.scss","components/_card.scss","components/_dialog.scss","components/_expansion-panel.scss","components/_link.scss"],"names":[],"mappings":"AAAA;AACQ;AACR;AACQ;AACR;ACJA;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;ADhIQ;AEZR;EACE,YDDa;;;ACIf;EACE,YDLa;ECMb;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;AACA;EANF;IAOI;;;;AAIJ;EACE,kBDaM;;ACZN;EAFF;IAGI;IACA;;;;AAIJ;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA,SCxDS;EDyDT;EACA;EACA;;AACA;EAVF;IAWI;;;AAEF;EACE;EAKA;;AACA;EACE;EACA,ODvBQ;;AC0BZ;EACE;EACA;EACA;;AACA;EAJF;IAKI;;;AAEF;EAPF;IAQI;;;AAEF;EACE;EACA;;AACA;EACE;;AAEF;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA,ODlDM;;ACoDR;EACE;;AAEF;EACE;IACE;IACA,OD1DI;;EC4DN;IACE;;EAEF;IACE;;;;AAOV;EACE;EACA;EACA;EACA;EACA;EACA;EACA,OD9EY;;AC+EZ;EACE;EACA;EACA;;AAEF;EACE;EACA;;;AAIJ;AACE;AAIA;AAIA;;AAPA;EACE;;AAGF;EACE,YDHc;;ACMhB;EACE,YDNc;;;AAnJlB;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AAhJA;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AG5IA;EACE,aCLU;;;ADQZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE,OHsCU;EGrCV,aChBU;;;ADmBZ;EACE;EACA,aCrBU;EDsBV;EACA;EACA;EACA;;;AAGF;EACE,aC7BU;ED8BV;EACA;EACA;EACA;EAEA;EACA;EACA,OHeY;EGdZ;;;AAEF;EACE,OHtBY;EGuBZ;EACA;;;AAIA;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;E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E,YT/DW;;;AAJf;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AU9IA;EACE;EACA,OVgDY;EU/CZ,YVkDgC;EUjDhC;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;AAEF;EACE;;;AAGJ;EACE;EACA;;AACA;EACE;EACA;EACA;;AAEF;EACE;;AACA;EACE;;AAGJ;EACE;EACA;;AAEF;EACE;;;AAGJ;EACE;EACA;;AACA;EACE;;;AAGJ;EACE;;;AVlDF;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AW/IA;EACE,OXgBW;;AWfX;EACE,OXcS;;;AWVb;EACE;EACA;;AACA;EACE;;;AAGJ;EACE;;;AAEF;EACE,OXiCY;;;ADlCd;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EAME;EACA,kBCzDa","file":"index.css"} \ No newline at end of file diff --git a/src/types/cozy-ui.d.ts b/src/types/cozy-ui.d.ts index a13bfbd3f043d8493ea441d5efba5c0b0cce5896..e45466e6769d12c9dcce14662af7d6754bd4e218 100644 --- a/src/types/cozy-ui.d.ts +++ b/src/types/cozy-ui.d.ts @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/interface-name-prefix */ -/* eslint-disable @typescript-eslint/no-explicit-any */ declare module 'cozy-ui/transpiled/react/Icon' declare module 'cozy-ui/transpiled/react/Spinner' declare module 'cozy-ui/transpiled/react/Layout' diff --git a/src/utils/picto.spec.ts b/src/utils/picto.spec.ts index 68ca4e3e300e03d252a1e6d2b693437fc19670c8..1e8838e7626615cdb4882cbf9f18dcfe06f45255 100644 --- a/src/utils/picto.spec.ts +++ b/src/utils/picto.spec.ts @@ -115,11 +115,11 @@ describe('picto utilis test', () => { describe('getPartnerPicto test', () => { it('should return enedis logo icon', () => { - const result = getPartnerPicto('enedisgrandlyon', false) + const result = getPartnerPicto('enedis-sge-grandlyon', false) expect(result).toBe(iconEnedisLogo) }) it('should return white enedis logo icon', () => { - const result = getPartnerPicto('enedisgrandlyon', true) + const result = getPartnerPicto('enedis-sge-grandlyon', true) expect(result).toBe(iconEnedisWhiteLogo) }) it('should return egl logo icon', () => { diff --git a/tests/__mocks__/accountsData.mock.ts b/tests/__mocks__/accountsData.mock.ts index ba83fe802f2ddcdfc4066e9150105ef33a4ddce7..f79d94eef56e4c66723c8695915b12a1d944b55b 100644 --- a/tests/__mocks__/accountsData.mock.ts +++ b/tests/__mocks__/accountsData.mock.ts @@ -1,11 +1,10 @@ -/* eslint-disable @typescript-eslint/camelcase */ import { Account } from 'models' export const accountsData: Account[] = [ { _id: '88e68b8450cee09fe2f077610901094d', _rev: '1-88e68b8450cee09fe2f077610901094d', - account_type: 'enedisgrandlyon', + account_type: 'enedis-sge-grandlyon', name: '', oauth: { access_token: 'MY_ACCESS_TOCKEN', diff --git a/tests/__mocks__/fluidStatusData.mock.ts b/tests/__mocks__/fluidStatusData.mock.ts index e9495d91ad3d8e71ce43308f0098bb7512ec301b..eed87db3203e78b254cdccc0ce585689ac49ab40 100644 --- a/tests/__mocks__/fluidStatusData.mock.ts +++ b/tests/__mocks__/fluidStatusData.mock.ts @@ -1,8 +1,8 @@ import { FluidState } from 'enum/fluid.enum' +import { FluidSlugType } from 'enum/fluidSlug.enum' import { DateTime } from 'luxon' import { FluidStatus } from 'models' import { PartnersInfo } from 'models/partnersInfo.model' -/* eslint-disable @typescript-eslint/camelcase */ export const fluidStatusData: FluidStatus[] = [ { @@ -24,7 +24,7 @@ export const fluidStatusData: FluidStatus[] = [ konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.ELECTRICITY, siteLink: '', activation: '', }, @@ -49,7 +49,7 @@ export const fluidStatusData: FluidStatus[] = [ konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.WATER, siteLink: '', activation: '', }, @@ -74,7 +74,7 @@ export const fluidStatusData: FluidStatus[] = [ konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.GAS, siteLink: '', activation: '', }, @@ -114,7 +114,7 @@ export const fluidStatusConnectedData: FluidStatus[] = [ konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.ELECTRICITY, siteLink: '', activation: '', }, @@ -139,7 +139,7 @@ export const fluidStatusConnectedData: FluidStatus[] = [ konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.WATER, siteLink: '', activation: '', }, @@ -164,10 +164,57 @@ export const fluidStatusConnectedData: FluidStatus[] = [ konnectorConfig: { name: '', oauth: true, - slug: '', + slug: FluidSlugType.GAS, siteLink: '', activation: '', }, }, }, ] +export const SgeStatusWithAccout: FluidStatus = { + fluidType: 0, + status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: DateTime.fromISO('2019-09-01T00:00:00.000Z', { + zone: 'utc', + }), + lastDataDate: DateTime.fromISO('2020-09-01T00:00:00.000Z', { + zone: 'utc', + }), + connection: { + shouldLaunchKonnector: false, + isUpdating: false, + konnector: null, + account: { + _id: '88e68b8450cee09fe2f077610901094d', + _rev: '1-88e68b8450cee09fe2f077610901094d', + account_type: 'enedis-sge-grandlyon', + name: '', + oauth: { + access_token: 'MY_ACCESS_TOCKEN', + expires_at: '2020-10-09T08:00:00.285910671+02:00', + refresh_token: '', + token_type: 'Bearer', + }, + oauth_callback_results: { + issued_at: '1592232569642', + refresh_token_issued_at: '1592232569642', + scope: '/my_eneids_scope', + usage_points_id: '', + }, + cozyMetadata: { + createdAt: '2020-11-10T16:42:11.132Z', + metadataVersion: 1, + updatedAt: '2020-11-10T16:42:11.132Z', + }, + }, + trigger: null, + triggerState: null, + konnectorConfig: { + name: '', + oauth: false, + slug: FluidSlugType.ELECTRICITY, + siteLink: '', + activation: '', + }, + }, +} diff --git a/tests/__mocks__/globalStateData.mock.ts b/tests/__mocks__/globalStateData.mock.ts index 4b8de03a74274e1cd9df2f8a74c4df7e440c3210..7f57f724b5cd20c78232b43538a5eff0c8dcd535 100644 --- a/tests/__mocks__/globalStateData.mock.ts +++ b/tests/__mocks__/globalStateData.mock.ts @@ -1,4 +1,5 @@ import { FluidState, FluidType } from 'enum/fluid.enum' +import { FluidSlugType } from 'enum/fluidSlug.enum' import { ScreenType } from 'enum/screen.enum' import { GlobalState } from 'models' @@ -33,7 +34,7 @@ export const globalStateData: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.ELECTRICITY, siteLink: '', activation: '', }, @@ -54,7 +55,7 @@ export const globalStateData: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.WATER, siteLink: '', activation: '', }, @@ -75,7 +76,7 @@ export const globalStateData: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.GAS, siteLink: '', activation: '', }, @@ -84,4 +85,16 @@ export const globalStateData: GlobalState = { ], fluidTypes: [], shouldRefreshConsent: false, + sgeConnect: { + currentStep: 0, + firstName: '', + lastName: '', + pdl: null, + address: '', + zipCode: null, + city: '', + dataConsent: false, + pdlConfirm: false, + shouldLaunchAccount: false, + }, } diff --git a/tests/__mocks__/konnectorsData.mock.ts b/tests/__mocks__/konnectorsData.mock.ts index b1a2498685116a6c09802648a464bba217fb34fb..f0671c57702ff4a945a9df22a596ca03731d688a 100644 --- a/tests/__mocks__/konnectorsData.mock.ts +++ b/tests/__mocks__/konnectorsData.mock.ts @@ -2,9 +2,9 @@ import { Konnector } from 'models' export const konnectorsData: Konnector[] = [ { - _id: 'io.cozy.konnectors/enedisgrandlyon', + _id: 'io.cozy.konnectors/enedis-sge-grandlyon', name: 'Enedis', - slug: 'enedisgrandlyon', + slug: 'enedis-sge-grandlyon', state: 'ready', }, { diff --git a/tests/__mocks__/mockConfig.mock.ts b/tests/__mocks__/mockConfig.mock.ts index 5cede83e872fa85290a48038c65befd1b95a421b..0a09c66984c13ef33654064323155375debf0f21 100644 --- a/tests/__mocks__/mockConfig.mock.ts +++ b/tests/__mocks__/mockConfig.mock.ts @@ -10,7 +10,7 @@ const mockConfig = { konnectorConfig: { name: 'Enedis', oauth: true, - slug: 'enedisgrandlyon', + slug: 'enedis-sge-grandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, diff --git a/tests/__mocks__/profileType.mock.ts b/tests/__mocks__/profileType.mock.ts index 52197f89c178db115de01ef5dae64f43f7f60d36..7262c68221dc88bd38669be611993480d7f97eb0 100644 --- a/tests/__mocks__/profileType.mock.ts +++ b/tests/__mocks__/profileType.mock.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/camelcase */ import { FluidType } from 'enum/fluid.enum' import { ConstructionYear, @@ -43,6 +42,7 @@ export const profileTypeData: ProfileType = { zone: 'utc', }), warmingFluid: 2, + equipments: [], } export const mockProfileType: ProfileType = { @@ -65,6 +65,7 @@ export const mockProfileType: ProfileType = { updateDate: DateTime.fromISO('2021-01-01T00:00:00.000Z', { zone: 'utc', }), + equipments: [], } export const mockEstimatedConsumption = 3182 export const mockCorrectedConsumption = 3500 @@ -101,6 +102,7 @@ export const mockProfileType1: ProfileType = { updateDate: DateTime.fromISO('2021-01-01T00:00:00.000Z', { zone: 'utc', }), + equipments: [], } export const mockEstimatedConsumption1 = 6450 export const mockCorrectedConsumption1 = 6450 @@ -129,6 +131,7 @@ export const mockProfileType2: ProfileType = { updateDate: DateTime.fromISO('2021-01-01T00:00:00.000Z', { zone: 'utc', }), + equipments: [], } export const mockEstimatedConsumption2 = 16560 export const mockCorrectedConsumption2 = 15411 @@ -155,6 +158,7 @@ export const mockTestProfile1: ProfileType = { updateDate: DateTime.fromISO('2021-01-01T00:00:00.000Z', { zone: 'utc', }), + equipments: [], } export const mockMonthlyForecastJanuaryTestProfile1: MonthlyForecast = { fluidForecast: [ @@ -219,6 +223,7 @@ export const mockTestProfile2: ProfileType = { updateDate: DateTime.fromISO('2021-01-01T00:00:00.000Z', { zone: 'utc', }), + equipments: [], } export const mockMonthlyForecastJanuaryTestProfile2: MonthlyForecast = { @@ -284,6 +289,7 @@ export const mockTestProfile3: ProfileType = { updateDate: DateTime.fromISO('2021-01-01T00:00:00.000Z', { zone: 'utc', }), + equipments: [], } export const mockMonthlyForecastJanuaryTestProfile3: MonthlyForecast = { diff --git a/tests/__mocks__/store.ts b/tests/__mocks__/store.ts index 74f61acc8ef2376b703c69b199126a9d3eee09be..305a23ab8216bba6fd846de2e22422e48bf342d3 100644 --- a/tests/__mocks__/store.ts +++ b/tests/__mocks__/store.ts @@ -1,6 +1,5 @@ -/* eslint-disable @typescript-eslint/camelcase */ - import { FluidState, FluidType } from 'enum/fluid.enum' +import { FluidSlugType } from 'enum/fluidSlug.enum' import { ConstructionYear, Floor, @@ -57,7 +56,7 @@ export const mockInitialGlobalState: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.ELECTRICITY, siteLink: '', activation: '', }, @@ -78,7 +77,7 @@ export const mockInitialGlobalState: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.WATER, siteLink: '', activation: '', }, @@ -99,7 +98,7 @@ export const mockInitialGlobalState: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.GAS, siteLink: '', activation: '', }, @@ -108,6 +107,18 @@ export const mockInitialGlobalState: GlobalState = { ], fluidTypes: [], shouldRefreshConsent: false, + sgeConnect: { + address: '', + city: '', + currentStep: 0, + dataConsent: false, + firstName: '', + lastName: '', + pdl: null, + pdlConfirm: false, + zipCode: null, + shouldLaunchAccount: false, + }, } export const mockExpiredElec: FluidStatus = { fluidType: FluidType.ELECTRICITY, @@ -132,7 +143,7 @@ export const mockExpiredElec: FluidStatus = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.ELECTRICITY, siteLink: '', activation: '', }, @@ -185,14 +196,13 @@ export const mockInitialProfileTypeState: ProfileType = { hotWaterFluid: FluidType.ELECTRICITY, cookingFluid: FluidType.ELECTRICITY, updateDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + equipments: [], } export const mockInitialChartState: ChartState = { - selectedDate: DateTime.local() - .endOf('minute') - .setZone('utc', { - keepLocalTime: true, - }), + selectedDate: DateTime.local().endOf('minute').setZone('utc', { + keepLocalTime: true, + }), currentTimeStep: TimeStep.WEEK, currentIndex: 0, currentDatachart: { actualData: [], comparisonData: null }, @@ -222,7 +232,6 @@ export const mockInitialEcolyoState = { const middlewares = [thunkMiddleware.withExtraArgument({ mockClient })] const mockStore = configureStore(middlewares) -// eslint-disable-next-line @typescript-eslint/no-explicit-any const mockedStore: any = mockStore({ ecolyo: mockInitialEcolyoState, }) diff --git a/tests/__mocks__/testUtils.ts b/tests/__mocks__/testUtils.ts index 2fe27298a9e9e930caf3ac30bf4e2f52489aaaa7..6b779ccf6faab7c684fa756df3415156264a349d 100644 --- a/tests/__mocks__/testUtils.ts +++ b/tests/__mocks__/testUtils.ts @@ -1,7 +1,6 @@ import { ReactWrapper } from 'enzyme' import { act } from 'react-dom/test-utils' -// eslint-disable-next-line @typescript-eslint/no-explicit-any export const waitForComponentToPaint = async <TP extends any = {}>( wrapper: ReactWrapper<TP> ): Promise<void> => { diff --git a/tests/__mocks__/triggersData.mock.ts b/tests/__mocks__/triggersData.mock.ts index c10a77c9b8073519e8f8c9ca5ec200c810204785..b24db384bb7381a226cfdf10a22a500a64228b46 100644 --- a/tests/__mocks__/triggersData.mock.ts +++ b/tests/__mocks__/triggersData.mock.ts @@ -12,7 +12,7 @@ export const triggersData: Trigger[] = [ options: null, message: { account: '88e68b8450cee09fe2f077610901094d', - konnector: 'enedisgrandlyon', + konnector: 'enedis-sge-grandlyon', }, cozyMetadata: { doctypeVersion: '1', @@ -78,7 +78,7 @@ export const triggersEnedisData: Trigger[] = [ options: null, message: { account: '88e68b8450cee09fe2f077610901094d', - konnector: 'enedisgrandlyon', + konnector: 'enedis-sge-grandlyon', }, cozyMetadata: { doctypeVersion: '1', @@ -99,7 +99,7 @@ export const triggersEnedisData: Trigger[] = [ options: null, message: { account: '90e68b8450cee09fe2f077610901094d', - konnector: 'enedisgrandlyon', + konnector: 'enedis-sge-grandlyon', }, cozyMetadata: { doctypeVersion: '1', @@ -120,7 +120,7 @@ export const triggersEnedisData: Trigger[] = [ options: null, message: { account: '89e68b8450cee09fe2f077610901094d', - konnector: 'enedisgrandlyon', + konnector: 'enedis-sge-grandlyon', }, cozyMetadata: { doctypeVersion: '1',