Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • build
  • build-dev
  • build-test
  • dev
  • lint/testing-libraby-plugin
  • master
  • renovate/copy-webpack-plugin-13.x
  • renovate/couchdb-3.x
  • renovate/cozy-client-49.x
  • renovate/cozy-device-helper-3.x
  • renovate/cozy-flags-4.x
  • renovate/cozy-harvest-lib-32.x
  • renovate/cozy-harvest-lib-9.x
  • renovate/cozy-realtime-5.x
  • renovate/cozy-scripts-8.x
  • renovate/devdependencies-(non-major)
  • renovate/eslint-9.x
  • renovate/eslint-config-prettier-10.x
  • renovate/eslint-plugin-testing-library-7.x
  • renovate/major-react-monorepo
  • renovate/major-react-router-monorepo
  • renovate/major-typescript-eslint-monorepo
  • renovate/react-19.x
  • renovate/react-dom-19.x
  • renovate/react-inspector-6.x
  • renovate/sass-loader-16.x
  • 0.1.0
  • 0.1.1
  • 0.1.2
  • 0.1.6
  • 0.1.7
  • 1.0.2
  • 1.0.3
  • 1.0.5
  • 1.0.6
  • 1.0.7
  • 1.0.8
  • 1.0.9
  • 1.1.0
  • 1.2.0
  • 1.2.1
  • 1.2.4-beta.1
  • V1.11.0
  • v1.10.0
  • v1.10.1
  • v1.10.2
  • v1.12.0
  • v1.12.1
  • v1.2.0
  • v1.2.1
  • v1.2.2
  • v1.2.3
  • v1.2.4
  • v1.2.4-beta.1
  • v1.3.0
  • v1.4.0
  • v1.4.1
  • v1.4.2
  • v1.4.3
  • v1.4.4
  • v1.5.0
  • v1.5.1
  • v1.6.0
  • v1.6.1
  • v1.6.2
  • v1.6.3
  • v1.6.4
  • v1.6.5
  • v1.7.0
  • v1.7.1
  • v1.7.2
  • v1.7.3
  • v1.7.4
  • v1.8.0
  • v1.8.1
  • v1.8.2
  • v1.8.3
  • v1.9.0
  • v1.9.1
  • v1.9.2
  • v1.9.3
  • v1.9.4
  • v2.0.0
  • v2.0.1
  • v2.0.2
  • v2.1.0
  • v2.1.1
  • v2.2.0
  • v2.2.1
  • v2.2.2
  • v2.3.0
  • v2.3.1
  • v2.4.0
  • v2.5.0
  • v2.5.1
  • v2.6.0
  • v2.7.0
  • v2.7.1
  • v2.7.2
  • v2.8.0
  • v3.0.0
  • v3.1.0
  • v3.1.1
103 results

Target

Select target project
  • web-et-numerique/factory/llle_project/ecolyo
1 result
Select Git revision
  • build
  • build-dev
  • build-test
  • dev
  • lint/testing-libraby-plugin
  • master
  • renovate/copy-webpack-plugin-13.x
  • renovate/couchdb-3.x
  • renovate/cozy-client-49.x
  • renovate/cozy-device-helper-3.x
  • renovate/cozy-flags-4.x
  • renovate/cozy-harvest-lib-32.x
  • renovate/cozy-harvest-lib-9.x
  • renovate/cozy-realtime-5.x
  • renovate/cozy-scripts-8.x
  • renovate/devdependencies-(non-major)
  • renovate/eslint-9.x
  • renovate/eslint-config-prettier-10.x
  • renovate/eslint-plugin-testing-library-7.x
  • renovate/major-react-monorepo
  • renovate/major-react-router-monorepo
  • renovate/major-typescript-eslint-monorepo
  • renovate/react-19.x
  • renovate/react-dom-19.x
  • renovate/react-inspector-6.x
  • renovate/sass-loader-16.x
  • 0.1.0
  • 0.1.1
  • 0.1.2
  • 0.1.6
  • 0.1.7
  • 1.0.2
  • 1.0.3
  • 1.0.5
  • 1.0.6
  • 1.0.7
  • 1.0.8
  • 1.0.9
  • 1.1.0
  • 1.2.0
  • 1.2.1
  • 1.2.4-beta.1
  • V1.11.0
  • v1.10.0
  • v1.10.1
  • v1.10.2
  • v1.12.0
  • v1.12.1
  • v1.2.0
  • v1.2.1
  • v1.2.2
  • v1.2.3
  • v1.2.4
  • v1.2.4-beta.1
  • v1.3.0
  • v1.4.0
  • v1.4.1
  • v1.4.2
  • v1.4.3
  • v1.4.4
  • v1.5.0
  • v1.5.1
  • v1.6.0
  • v1.6.1
  • v1.6.2
  • v1.6.3
  • v1.6.4
  • v1.6.5
  • v1.7.0
  • v1.7.1
  • v1.7.2
  • v1.7.3
  • v1.7.4
  • v1.8.0
  • v1.8.1
  • v1.8.2
  • v1.8.3
  • v1.9.0
  • v1.9.1
  • v1.9.2
  • v1.9.3
  • v1.9.4
  • v2.0.0
  • v2.0.1
  • v2.0.2
  • v2.1.0
  • v2.1.1
  • v2.2.0
  • v2.2.1
  • v2.2.2
  • v2.3.0
  • v2.3.1
  • v2.4.0
  • v2.5.0
  • v2.5.1
  • v2.6.0
  • v2.7.0
  • v2.7.1
  • v2.7.2
  • v2.8.0
  • v3.0.0
  • v3.1.0
  • v3.1.1
103 results
Show changes
Commits on Source (56)
Showing
with 434 additions and 401 deletions
...@@ -100,6 +100,7 @@ ...@@ -100,6 +100,7 @@
"grdfgrandlyon", "grdfgrandlyon",
"Hypervitesse", "Hypervitesse",
"késako", "késako",
"kmodal",
"Konnected", "Konnected",
"konnector", "konnector",
"konnectors", "konnectors",
......
...@@ -19,22 +19,25 @@ module.exports = { ...@@ -19,22 +19,25 @@ module.exports = {
__STACK_ASSETS__: target !== 'mobile', __STACK_ASSETS__: target !== 'mobile',
__PIWIK_TRACKER_URL__: JSON.stringify('https://statweb.grandlyon.com/'), __PIWIK_TRACKER_URL__: JSON.stringify('https://statweb.grandlyon.com/'),
__PIWIK_SITEID__: 117, __PIWIK_SITEID__: 117,
__SENTRY_DSN__: JSON.stringify(
'https://c868f6010f3f431d95be8f70d7f37666@grandlyon.errors.cozycloud.cc/6'
),
__SAU_LINK__: JSON.stringify( __SAU_LINK__: JSON.stringify(
'https://portail-citoyen-sau.guichet-recette.grandlyon.com/ecolyo/' 'https://portail-citoyen-sau.guichet-recette.grandlyon.com/ecolyo/'
), ),
__SAU_IDEA_DIRECT_LINK__: JSON.stringify( __SAU_IDEA_DIRECT_LINK__: JSON.stringify(
'https://demarches-sau.guichet-recette.grandlyon.com/retour-ecolyo/ecolyo-une-idee/' 'https://demarches-sau.guichet-recette.grandlyon.com/retour-ecolyo/ecolyo-une-idee/'
), ),
__SAU_ISSUE_DIRECT_LINK__: JSON.stringify(
'https://demarches-sau.guichet-recette.grandlyon.com/retour-ecolyo/ecolyo-un-probleme/'
),
__SENTRY_DSN__: JSON.stringify(
'https://c868f6010f3f431d95be8f70d7f37666@grandlyon.errors.cozycloud.cc/6'
),
}), }),
], ],
optimization: { optimization: {
minimizer: [ minimizer: [
new TerserPlugin({ new TerserPlugin({
parallel: true, parallel: true,
//To fix a SAfari 10 bug : https://github.com/zeit/next.js/issues/5630 // To fix a SAfari 10 bug : https://github.com/zeit/next.js/issues/5630
terserOptions: { terserOptions: {
safari10: true, safari10: true,
}, },
......
...@@ -29,6 +29,9 @@ const stackProvidedLibsConfig = { ...@@ -29,6 +29,9 @@ const stackProvidedLibsConfig = {
__SAU_IDEA_DIRECT_LINK__: JSON.stringify( __SAU_IDEA_DIRECT_LINK__: JSON.stringify(
'https://demarches-sau.guichet-recette.grandlyon.com/retour-ecolyo/ecolyo-une-idee/' 'https://demarches-sau.guichet-recette.grandlyon.com/retour-ecolyo/ecolyo-une-idee/'
), ),
__SAU_ISSUE_DIRECT_LINK__: JSON.stringify(
'https://demarches-sau.guichet-recette.grandlyon.com/retour-ecolyo/ecolyo-un-probleme/'
),
__SENTRY_DSN__: JSON.stringify( __SENTRY_DSN__: JSON.stringify(
'https://c868f6010f3f431d95be8f70d7f37666@grandlyon.errors.cozycloud.cc/6' 'https://c868f6010f3f431d95be8f70d7f37666@grandlyon.errors.cozycloud.cc/6'
), ),
......
...@@ -23,6 +23,9 @@ module.exports = { ...@@ -23,6 +23,9 @@ module.exports = {
__SAU_IDEA_DIRECT_LINK__: JSON.stringify( __SAU_IDEA_DIRECT_LINK__: JSON.stringify(
'https://demarches-support.grandlyon.com/retour-ecolyo/ecolyo-une-idee/' 'https://demarches-support.grandlyon.com/retour-ecolyo/ecolyo-une-idee/'
), ),
__SAU_ISSUE_DIRECT_LINK__: JSON.stringify(
'https://demarches-support.grandlyon.com/retour-ecolyo/ecolyo-un-probleme/'
),
__SENTRY_DSN__: JSON.stringify( __SENTRY_DSN__: JSON.stringify(
'https://c868f6010f3f431d95be8f70d7f37666@grandlyon.errors.cozycloud.cc/6' 'https://c868f6010f3f431d95be8f70d7f37666@grandlyon.errors.cozycloud.cc/6'
), ),
...@@ -32,7 +35,7 @@ module.exports = { ...@@ -32,7 +35,7 @@ module.exports = {
minimizer: [ minimizer: [
new TerserPlugin({ new TerserPlugin({
parallel: true, parallel: true,
//To fix a SAfari 10 bug : https://github.com/zeit/next.js/issues/5630 // To fix a SAfari 10 bug : https://github.com/zeit/next.js/issues/5630
terserOptions: { terserOptions: {
safari10: true, safari10: true,
}, },
......
...@@ -20,15 +20,14 @@ export enum GrdfStep { ...@@ -20,15 +20,14 @@ export enum GrdfStep {
} }
export const GrdfConnectView = () => { export const GrdfConnectView = () => {
const [launchConnection, setLaunchConnection] = useState(false)
const navigate = useNavigate() const navigate = useNavigate()
const { data: instanceSettings } = useUserInstanceSettings()
const { fluidStatus } = useAppSelector(state => state.ecolyo.global) const { fluidStatus } = useAppSelector(state => state.ecolyo.global)
const currentFluidStatus = fluidStatus[FluidType.GAS] const currentFluidStatus = fluidStatus[FluidType.GAS]
const account = currentFluidStatus.connection.account const account = currentFluidStatus.connection.account
const { data: instanceSettings } = useUserInstanceSettings()
const [launchConnection, setLaunchConnection] = useState(false)
const [currentStep, setCurrentStep] = useState<GrdfStep>(GrdfStep.Identity) const [currentStep, setCurrentStep] = useState<GrdfStep>(GrdfStep.Identity)
const [formData, setFormData] = useState<AccountGRDFData>({ const [formData, setFormData] = useState<AccountGRDFData>({
lastname: '', lastname: '',
firstname: '', firstname: '',
......
...@@ -4,15 +4,16 @@ ...@@ -4,15 +4,16 @@
margin: auto; margin: auto;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 1rem; gap: 0.5rem;
align-items: center; align-items: center;
text-align: center; text-align: center;
padding-inline: 1rem;
.green { .green {
color: var(--gasColor); color: var(--gasColor);
} }
.emailContainer span { .emailContainer {
color: $gold-shadow; color: $gold-shadow;
font-weight: 700; font-weight: 700;
} }
......
import { Button } from '@material-ui/core' import { Button, Dialog, IconButton } from '@material-ui/core'
import CloseIcon from 'assets/icons/ico/close.svg'
import GRDFMail from 'assets/icons/visu/onboarding/grdf-mail.svg' import GRDFMail from 'assets/icons/visu/onboarding/grdf-mail.svg'
import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
import useUserInstanceSettings from 'components/Hooks/useUserInstanceSettings'
import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { useI18n } from 'cozy-ui/transpiled/react/I18n'
import React from 'react' import Icon from 'cozy-ui/transpiled/react/Icon'
import { FluidType } from 'enums'
import { FluidConnection } from 'models'
import React, { useEffect, useState } from 'react'
import { updateFluidConnection } from 'store/global/global.slice'
import { useAppDispatch, useAppSelector } from 'store/hooks'
import './GrdfWaitConsent.scss' import './GrdfWaitConsent.scss'
export const GrdfWaitConsent = () => { export const GrdfWaitConsent = () => {
const { t } = useI18n() const { t } = useI18n()
const dispatch = useAppDispatch()
const { fluidStatus } = useAppSelector(state => state.ecolyo.global)
const { data: instanceSettings } = useUserInstanceSettings()
const [emailSentOn, setEmailSentOn] = useState('')
const currentFluidStatus = fluidStatus[FluidType.GAS]
useEffect(() => {
setEmailSentOn(instanceSettings.email || '')
}, [instanceSettings])
const updateKonnector = async () => {
const updatedConnection: FluidConnection = {
...currentFluidStatus.connection,
// TODO : investigate is this is duplicate ?
shouldLaunchKonnector: true,
isUpdating: true,
}
dispatch(
updateFluidConnection({
fluidType: currentFluidStatus.fluidType,
fluidConnection: updatedConnection,
})
)
}
return ( return (
<div className="grdfWait"> <div className="grdfWait">
<div <div className="text-18-normal">
className="text-18-normal emailContainer" {t('auth.grdfgrandlyon.waiting.mailSent')}
dangerouslySetInnerHTML={{ </div>
__html: t('auth.grdfgrandlyon.waiting.mailSent', { <div className="text-16-normal">
email: 'test@test.com', {t('auth.grdfgrandlyon.waiting.mailDelay')}
}), </div>
}} <span className="emailContainer">{emailSentOn}</span>
/>
<StyledIcon size={80} icon={GRDFMail} /> <StyledIcon size={80} icon={GRDFMail} />
<div className="text-18-normal"> <div className="text-18-normal">
<span className="text-18-bold green"> <span className="text-18-bold green">
...@@ -25,9 +56,43 @@ export const GrdfWaitConsent = () => { ...@@ -25,9 +56,43 @@ export const GrdfWaitConsent = () => {
<br /> <br />
<span>{t('auth.grdfgrandlyon.waiting.comeback')}</span> <span>{t('auth.grdfgrandlyon.waiting.comeback')}</span>
</div> </div>
<Button className="btnPrimary"> <Button className="btnPrimary" onClick={updateKonnector}>
{t('auth.grdfgrandlyon.waiting.button_done')} {t('auth.grdfgrandlyon.waiting.button_done')}
</Button> </Button>
</div> </div>
) )
} }
export const GrdfWaitConsentModal = ({
open,
setOpen,
}: {
open: boolean
setOpen: React.Dispatch<React.SetStateAction<boolean>>
}) => {
const { t } = useI18n()
return (
<Dialog
open={open}
onClose={() => setOpen(false)}
aria-labelledby="accessibility-title"
classes={{
root: 'modal-root',
paper: 'modal-paper',
}}
>
<div id="accessibility-title">
{t('consumption_visualizer.modal.window_title')}
</div>
<IconButton
aria-label={t('consumption_visualizer.modal.close')}
className="modal-paper-close-button"
onClick={() => setOpen(false)}
>
<Icon icon={CloseIcon} size={16} />
</IconButton>
<GrdfWaitConsent />
</Dialog>
)
}
import ExpiredConsentModal from 'components/Connection/ExpiredConsentModal/ExpiredConsentModal' import ExpiredConsentModal from 'components/Connection/ExpiredConsentModal/ExpiredConsentModal'
import { GrdfWaitConsentModal } from 'components/Connection/GRDFConnect/GrdfWaitConsent'
import Content from 'components/Content/Content' import Content from 'components/Content/Content'
import CustomPopupModal from 'components/CustomPopup/CustomPopupModal' import CustomPopupModal from 'components/CustomPopup/CustomPopupModal'
import DateNavigator from 'components/DateNavigator/DateNavigator' import DateNavigator from 'components/DateNavigator/DateNavigator'
...@@ -10,7 +11,7 @@ import KonnectorViewerList from 'components/Konnector/KonnectorViewerList' ...@@ -10,7 +11,7 @@ import KonnectorViewerList from 'components/Konnector/KonnectorViewerList'
import PartnerIssueModal from 'components/PartnerIssue/PartnerIssueModal' import PartnerIssueModal from 'components/PartnerIssue/PartnerIssueModal'
import ReleaseNotesModal from 'components/ReleaseNotesModal/ReleaseNotesModal' import ReleaseNotesModal from 'components/ReleaseNotesModal/ReleaseNotesModal'
import { useClient } from 'cozy-client' import { useClient } from 'cozy-client'
import { FluidType, TimeStep } from 'enums' import { FluidState, FluidType, TimeStep } from 'enums'
import { DateTime } from 'luxon' import { DateTime } from 'luxon'
import React, { useCallback, useEffect, useState } from 'react' import React, { useCallback, useEffect, useState } from 'react'
import { useNavigate } from 'react-router-dom' import { useNavigate } from 'react-router-dom'
...@@ -45,29 +46,51 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => { ...@@ -45,29 +46,51 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => {
modal: { partnersIssueModal, customPopupModal }, modal: { partnersIssueModal, customPopupModal },
} = useAppSelector(state => state.ecolyo) } = useAppSelector(state => state.ecolyo)
const currentFluidStatus = fluidStatus[fluidType]
const dateChartService = new DateChartService() const dateChartService = new DateChartService()
const isWaitingForConsent =
fluidType === FluidType.GAS &&
currentFluidStatus.status === FluidState.CHALLENGE_ASKED
const [waitConsent, setWaitConsent] = useState(isWaitingForConsent)
const [openExpiredConsentModal, setOpenExpiredConsentModal] = useState(true)
const [openReleaseNoteModal, setOpenReleaseNoteModal] = useState<boolean>( const [openReleaseNoteModal, setOpenReleaseNoteModal] = useState<boolean>(
releaseNotes.show releaseNotes.show
) )
const [openExpiredConsentModal, setOpenExpiredConsentModal] =
useState<boolean>(true)
const [consentExpiredFluids, setConsentExpiredFluids] = useState<FluidType[]>( const [consentExpiredFluids, setConsentExpiredFluids] = useState<FluidType[]>(
[] []
) )
/** Show wait consent modal when navigating and consent is "A valider" */
useEffect(() => {
setWaitConsent(isWaitingForConsent)
}, [isWaitingForConsent])
const updateKey = const updateKey =
fluidType !== FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate fluidType !== FluidType.MULTIFLUID && currentFluidStatus.lastDataDate
? `${fluidStatus[fluidType].lastDataDate!.toLocaleString()} + ${ ? `${currentFluidStatus.lastDataDate.toLocaleString()} + ${
fluidStatus[fluidType].status + fluidType currentFluidStatus.status + fluidType
}` }`
: '' : ''
const lastDataDateKey = const lastDataDateKey =
fluidType !== FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate fluidType !== FluidType.MULTIFLUID && currentFluidStatus.lastDataDate
? `${fluidStatus[fluidType].lastDataDate!.toLocaleString() + fluidType}` ? `${currentFluidStatus.lastDataDate.toLocaleString() + fluidType}`
: '' : ''
const getPartnerKey = (fluidType: FluidType): 'enedis' | 'egl' | 'grdf' => {
switch (fluidType) {
case FluidType.ELECTRICITY:
return 'enedis'
case FluidType.WATER:
return 'egl'
case FluidType.GAS:
return 'grdf'
default:
throw new Error('unknown fluidtype')
}
}
const handleCloseReleaseNoteModal = useCallback(() => { const handleCloseReleaseNoteModal = useCallback(() => {
setOpenReleaseNoteModal(false) setOpenReleaseNoteModal(false)
dispatch( dispatch(
...@@ -82,19 +105,6 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => { ...@@ -82,19 +105,6 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => {
} }
}, [dispatch, navigate, releaseNotes.notes, releaseNotes.redirectLink]) }, [dispatch, navigate, releaseNotes.notes, releaseNotes.redirectLink])
const getPartnerKey = (fluidType: FluidType): 'enedis' | 'egl' | 'grdf' => {
switch (fluidType) {
case FluidType.ELECTRICITY:
return 'enedis'
case FluidType.WATER:
return 'egl'
case FluidType.GAS:
return 'grdf'
default:
throw new Error('unknown fluidtype')
}
}
const handleClosePartnerIssueModal = useCallback( const handleClosePartnerIssueModal = useCallback(
async (fluidType: FluidType) => { async (fluidType: FluidType) => {
const profileService = new ProfileService(client) const profileService = new ProfileService(client)
...@@ -134,15 +144,18 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => { ...@@ -134,15 +144,18 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => {
} }
} }
/** Handle time change */ useEffect(
useEffect(() => { /** Reset half-hour timestep for water & gas & multifluid */
if ( function setDefaultTimeStep() {
fluidType !== FluidType.ELECTRICITY && if (
currentTimeStep == TimeStep.HALF_AN_HOUR fluidType !== FluidType.ELECTRICITY &&
) { currentTimeStep == TimeStep.HALF_AN_HOUR
dispatch(setCurrentTimeStep(TimeStep.WEEK)) ) {
} dispatch(setCurrentTimeStep(TimeStep.WEEK))
}, [dispatch, fluidType, currentTimeStep]) }
},
[dispatch, fluidType, currentTimeStep]
)
/** /**
* If fluid is not connected, display Connect components * If fluid is not connected, display Connect components
...@@ -153,10 +166,11 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => { ...@@ -153,10 +166,11 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => {
dispatch(setShowOfflineData(isFluidConnected)) dispatch(setShowOfflineData(isFluidConnected))
}, [dispatch, fluidStatus, fluidType]) }, [dispatch, fluidStatus, fluidType])
/** Check if some fluids have expired consent error */
useEffect(() => { useEffect(() => {
let subscribed = true let subscribed = true
const expiredConsents: FluidType[] = [] const expiredConsents: FluidType[] = []
// Check if some fluids have expired consent error // TODO only electricity can have expired consent error -> refactor this for of loop
for (const fluid of fluidStatus) { for (const fluid of fluidStatus) {
const error = fluid.connection.triggerState?.last_error const error = fluid.connection.triggerState?.last_error
if (error && getKonnectorUpdateError(error) === 'error_update_oauth') { if (error && getKonnectorUpdateError(error) === 'error_update_oauth') {
...@@ -220,38 +234,24 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => { ...@@ -220,38 +234,24 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => {
<Content> <Content>
<FluidButtons activeFluid={fluidType} key={updateKey} /> <FluidButtons activeFluid={fluidType} key={updateKey} />
{openReleaseNoteModal && (
<ReleaseNotesModal
open={openReleaseNoteModal}
handleCloseClick={handleCloseReleaseNoteModal}
/>
)}
{showOfflineData && ( {showOfflineData && (
<> <>
<FluidChart fluidType={fluidType} key={lastDataDateKey} /> <FluidChart fluidType={fluidType} key={lastDataDateKey} />
<ConsumptionDetails fluidType={fluidType} /> <ConsumptionDetails fluidType={fluidType} />
{!isMulti && (
<KonnectorViewerCard
fluidType={fluidType}
showOfflineData={true}
key={fluidType}
/>
)}
</> </>
)} )}
{!showOfflineData && ( {!isMulti && <KonnectorViewerCard fluidType={fluidType} />}
<div className="konnector-section">
{isMulti ? ( {isMulti && !showOfflineData && <KonnectorViewerList />}
<KonnectorViewerList />
) : (
<KonnectorViewerCard
fluidType={fluidType}
showOfflineData={false}
/>
)}
</div>
)}
</Content> </Content>
{/* MODALS */}
{openReleaseNoteModal && (
<ReleaseNotesModal
open={openReleaseNoteModal}
handleCloseClick={handleCloseReleaseNoteModal}
/>
)}
{/* Partner issue modals for individual fluids */} {/* Partner issue modals for individual fluids */}
{fluidStatus {fluidStatus
.filter(fluid => fluid.maintenance) .filter(fluid => fluid.maintenance)
...@@ -269,17 +269,18 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => { ...@@ -269,17 +269,18 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => {
handleCloseClick={handleCloseCustomPopupModal} handleCloseClick={handleCloseCustomPopupModal}
/> />
{Boolean(consentExpiredFluids.length) && {Boolean(consentExpiredFluids.length) &&
consentExpiredFluids.map(fluid => { consentExpiredFluids.map(fluid => (
return ( <ExpiredConsentModal
<ExpiredConsentModal key={fluid}
key={fluid} open={openExpiredConsentModal}
open={openExpiredConsentModal} handleCloseClick={() => setOpenExpiredConsentModal(false)}
handleCloseClick={() => setOpenExpiredConsentModal(false)} fluidType={fluid}
fluidType={fluid} toggleModal={() => setOpenExpiredConsentModal(prev => !prev)}
toggleModal={() => setOpenExpiredConsentModal(prev => !prev)} />
/> ))}
)
})} {/* GRDF Waiting screen */}
<GrdfWaitConsentModal open={waitConsent} setOpen={setWaitConsent} />
</> </>
) )
} }
......
...@@ -32,7 +32,7 @@ const FluidButton = ({ fluidType, isActive }: FluidButtonProps) => { ...@@ -32,7 +32,7 @@ const FluidButton = ({ fluidType, isActive }: FluidButtonProps) => {
(fluidType !== FluidType.MULTIFLUID && (fluidType !== FluidType.MULTIFLUID &&
fluidStatus[fluidType].status === FluidState.ERROR) || fluidStatus[fluidType].status === FluidState.ERROR) ||
(fluidType !== FluidType.WATER && (fluidType !== FluidType.WATER &&
fluidStatus[fluidType].status === FluidState.ERROR_LOGIN_FAILED) fluidStatus[fluidType].status === FluidState.LOGIN_FAILED)
) { ) {
return true return true
} }
......
...@@ -60,7 +60,6 @@ const formatAuthData = ({ ...@@ -60,7 +60,6 @@ const formatAuthData = ({
} }
const useKonnectorAuth = ( const useKonnectorAuth = (
// not needed ?
fluidType: FluidType, fluidType: FluidType,
options: { options: {
eglAuthData?: AccountEGLData eglAuthData?: AccountEGLData
......
...@@ -5,7 +5,7 @@ import StyledIcon from 'components/CommonKit/Icon/StyledIcon' ...@@ -5,7 +5,7 @@ import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
import Loader from 'components/Loader/Loader' import Loader from 'components/Loader/Loader'
import { useClient } from 'cozy-client' import { useClient } from 'cozy-client'
import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { useI18n } from 'cozy-ui/transpiled/react/I18n'
import { FluidType, KonnectorUpdate } from 'enums' import { FluidState, FluidType, KonnectorUpdate } from 'enums'
import { DateTime } from 'luxon' import { DateTime } from 'luxon'
import { Account, AccountSgeData, FluidConnection, FluidStatus } from 'models' import { Account, AccountSgeData, FluidConnection, FluidStatus } from 'models'
import React, { useCallback, useEffect, useState } from 'react' import React, { useCallback, useEffect, useState } from 'react'
...@@ -38,6 +38,7 @@ const ConnectionResult = ({ ...@@ -38,6 +38,7 @@ const ConnectionResult = ({
const account: Account | null = currentFluidStatus.connection.account const account: Account | null = currentFluidStatus.connection.account
const [deleting, setDeleting] = useState<boolean>(false) const [deleting, setDeleting] = useState<boolean>(false)
// todo remove updating state
const [updating, setUpdating] = useState<boolean>(false) const [updating, setUpdating] = useState<boolean>(false)
const [lastExecutionDate, setLastExecutionDate] = useState<string | DateTime>( const [lastExecutionDate, setLastExecutionDate] = useState<string | DateTime>(
'-' '-'
...@@ -46,6 +47,10 @@ const ConnectionResult = ({ ...@@ -46,6 +47,10 @@ const ConnectionResult = ({
const [status, setStatus] = useState<string>('') const [status, setStatus] = useState<string>('')
const [outDatedDataDays, setOutDatedDataDays] = useState<number | null>(null) const [outDatedDataDays, setOutDatedDataDays] = useState<number | null>(null)
const isWaitingForConsent =
fluidType === FluidType.GAS &&
currentFluidStatus.status === FluidState.CHALLENGE_ASKED
const updateKonnector = async () => { const updateKonnector = async () => {
setUpdating(true) setUpdating(true)
setStatus('') setStatus('')
...@@ -110,37 +115,35 @@ const ConnectionResult = ({ ...@@ -110,37 +115,35 @@ const ConnectionResult = ({
} }
}, [lastExecutionDate]) }, [lastExecutionDate])
const handleRefreshConsent = useCallback( const handleRefreshConsent = useCallback(() => {
(fluidType: FluidType) => { if (fluidType == FluidType.ELECTRICITY) {
if (fluidType == FluidType.ELECTRICITY) { const accountData = currentFluidStatus.connection.account
const accountData = currentFluidStatus.connection.account ?.auth as AccountSgeData
?.auth as AccountSgeData // store the previous account data since the onDelete will remove account from DB
// store the previous account data since the onDelete will remove account from DB dispatch(
dispatch( updateSgeStore({
updateSgeStore({ currentStep: 0,
currentStep: 0, firstName: accountData.firstname,
firstName: accountData.firstname, lastName: accountData.lastname,
lastName: accountData.lastname, pdl: parseInt(accountData.pointId),
pdl: parseInt(accountData.pointId), address: accountData.address,
address: accountData.address, zipCode: parseInt(accountData.postalCode),
zipCode: parseInt(accountData.postalCode), city: accountData.city,
city: accountData.city, dataConsent: true,
dataConsent: true, pdlConfirm: true,
pdlConfirm: true, shouldLaunchAccount: true,
shouldLaunchAccount: true, })
}) )
) dispatch(setShouldRefreshConsent(true))
dispatch(setShouldRefreshConsent(true)) } else {
} else { deleteAccountsAndTriggers()
deleteAccountsAndTriggers() }
} }, [
}, fluidType,
[ currentFluidStatus.connection.account?.auth,
deleteAccountsAndTriggers, dispatch,
dispatch, deleteAccountsAndTriggers,
currentFluidStatus.connection.account?.auth, ])
]
)
useEffect(() => { useEffect(() => {
if (currentFluidStatus.connection.triggerState?.last_success) { if (currentFluidStatus.connection.triggerState?.last_success) {
...@@ -162,9 +165,8 @@ const ConnectionResult = ({ ...@@ -162,9 +165,8 @@ const ConnectionResult = ({
) )
) )
} }
if (isOutdated()) { const outdated = isOutdated()
setOutDatedDataDays(isOutdated()) if (outdated) setOutDatedDataDays(outdated)
}
}, [currentFluidStatus.connection.triggerState, isOutdated]) }, [currentFluidStatus.connection.triggerState, isOutdated])
const getFluidTypeTranslation = (fluidType: FluidType) => { const getFluidTypeTranslation = (fluidType: FluidType) => {
...@@ -178,9 +180,7 @@ const ConnectionResult = ({ ...@@ -178,9 +180,7 @@ const ConnectionResult = ({
} }
} }
const consentError = const consentError = konnectorError === KonnectorUpdate.ERROR_UPDATE_OAUTH
konnectorError === KonnectorUpdate.ERROR_CONSENT_FORM_GAS ||
konnectorError === KonnectorUpdate.ERROR_UPDATE_OAUTH
/** /**
* Get Konnector state, possible values: * Get Konnector state, possible values:
...@@ -193,12 +193,17 @@ const ConnectionResult = ({ ...@@ -193,12 +193,17 @@ const ConnectionResult = ({
// First check if there is partner error from backoffice // First check if there is partner error from backoffice
if (currentFluidStatus.maintenance) { if (currentFluidStatus.maintenance) {
return ( return (
<div className="connection-caption text-16-normal"> <div className="connection-caption">
<div className="text-16-normal"> {t('konnector_form.wait_end_issue')}
<div className="connection-caption"> </div>
{t('konnector_form.wait_end_issue')} )
</div> }
</div>
if (isWaitingForConsent) {
return (
<div className="connection-caption">
<div>{t('auth.grdfgrandlyon.waiting.validate')}</div>
<div>{t('auth.grdfgrandlyon.waiting.comeback')}</div>
</div> </div>
) )
} }
...@@ -233,19 +238,21 @@ const ConnectionResult = ({ ...@@ -233,19 +238,21 @@ const ConnectionResult = ({
) )
} }
const getErrorClassName = (): string => {
if (isWaitingForConsent) return ''
if (
status === 'errored' &&
!hasUpdatedToday() &&
!currentFluidStatus.maintenance
) {
return 'connection-update-errored'
}
return ''
}
return ( return (
<div className="connection-update-result"> <div className="connection-update-result">
<div <div className={getErrorClassName()}>{getConnectionStatus()}</div>
className={
status === 'errored' &&
!hasUpdatedToday() &&
!currentFluidStatus.maintenance
? 'connection-update-errored'
: ''
}
>
{getConnectionStatus()}
</div>
<div className="inline-buttons"> <div className="inline-buttons">
{!consentError && ( {!consentError && (
<Button <Button
...@@ -254,18 +261,12 @@ const ConnectionResult = ({ ...@@ -254,18 +261,12 @@ const ConnectionResult = ({
disabled={updating || deleting} disabled={updating || deleting}
className="btnSecondary" className="btnSecondary"
> >
{deleting {t(`konnector_form.${deleting ? 'loading' : 'button_disconnect'}`)}
? t('konnector_form.loading')
: t('konnector_form.button_disconnect')}
</Button> </Button>
)} )}
<Button <Button
aria-label={t('konnector_form.accessibility.button_update')} aria-label={t('konnector_form.accessibility.button_update')}
onClick={ onClick={consentError ? handleRefreshConsent : updateKonnector}
consentError
? () => handleRefreshConsent(fluidType)
: updateKonnector
}
disabled={updating || deleting} disabled={updating || deleting}
className="btnPrimary" className="btnPrimary"
> >
......
...@@ -23,7 +23,7 @@ describe('KonnectorModal component', () => { ...@@ -23,7 +23,7 @@ describe('KonnectorModal component', () => {
error={null} error={null}
fluidType={FluidType.ELECTRICITY} fluidType={FluidType.ELECTRICITY}
handleCloseClick={mockHandleCloseClick} handleCloseClick={mockHandleCloseClick}
isLogging={false} isVerifyingIdentity={false}
account={null} account={null}
handleAccountDeletion={jest.fn()} handleAccountDeletion={jest.fn()}
/> />
...@@ -41,7 +41,7 @@ describe('KonnectorModal component', () => { ...@@ -41,7 +41,7 @@ describe('KonnectorModal component', () => {
error={null} error={null}
fluidType={FluidType.ELECTRICITY} fluidType={FluidType.ELECTRICITY}
handleCloseClick={mockHandleCloseClick} handleCloseClick={mockHandleCloseClick}
isLogging={false} isVerifyingIdentity={false}
account={null} account={null}
handleAccountDeletion={jest.fn()} handleAccountDeletion={jest.fn()}
/> />
...@@ -61,7 +61,7 @@ describe('KonnectorModal component', () => { ...@@ -61,7 +61,7 @@ describe('KonnectorModal component', () => {
error={null} error={null}
fluidType={FluidType.ELECTRICITY} fluidType={FluidType.ELECTRICITY}
handleCloseClick={mockHandleCloseClick} handleCloseClick={mockHandleCloseClick}
isLogging={false} isVerifyingIdentity={false}
account={null} account={null}
handleAccountDeletion={jest.fn()} handleAccountDeletion={jest.fn()}
/> />
...@@ -80,14 +80,14 @@ describe('KonnectorModal component', () => { ...@@ -80,14 +80,14 @@ describe('KonnectorModal component', () => {
error={KonnectorError.LOGIN_FAILED} error={KonnectorError.LOGIN_FAILED}
fluidType={FluidType.ELECTRICITY} fluidType={FluidType.ELECTRICITY}
handleCloseClick={mockHandleCloseClick} handleCloseClick={mockHandleCloseClick}
isLogging={false} isVerifyingIdentity={false}
account={null} account={null}
handleAccountDeletion={jest.fn()} handleAccountDeletion={jest.fn()}
/> />
</Provider> </Provider>
) )
expect( expect(
baseElement.getElementsByClassName('kce-picto-txt')[0] baseElement.getElementsByClassName('headerError')[0]
).toBeInTheDocument() ).toBeInTheDocument()
}) })
it('should render unknown error', async () => { it('should render unknown error', async () => {
...@@ -100,7 +100,7 @@ describe('KonnectorModal component', () => { ...@@ -100,7 +100,7 @@ describe('KonnectorModal component', () => {
error={null} error={null}
fluidType={FluidType.ELECTRICITY} fluidType={FluidType.ELECTRICITY}
handleCloseClick={mockHandleCloseClick} handleCloseClick={mockHandleCloseClick}
isLogging={false} isVerifyingIdentity={false}
account={null} account={null}
handleAccountDeletion={jest.fn()} handleAccountDeletion={jest.fn()}
/> />
...@@ -120,7 +120,7 @@ describe('KonnectorModal component', () => { ...@@ -120,7 +120,7 @@ describe('KonnectorModal component', () => {
error={null} error={null}
fluidType={FluidType.WATER} fluidType={FluidType.WATER}
handleCloseClick={mockHandleCloseClick} handleCloseClick={mockHandleCloseClick}
isLogging={false} isVerifyingIdentity={false}
account={null} account={null}
handleAccountDeletion={jest.fn()} handleAccountDeletion={jest.fn()}
/> />
......
...@@ -17,6 +17,7 @@ import { FluidType, KonnectorError } from 'enums' ...@@ -17,6 +17,7 @@ import { FluidType, KonnectorError } from 'enums'
import { shuffle } from 'lodash' import { shuffle } from 'lodash'
import { Account } from 'models' import { Account } from 'models'
import React, { useCallback, useEffect, useMemo, useState } from 'react' import React, { useCallback, useEffect, useMemo, useState } from 'react'
import { getFluidName } from 'utils/utils'
import KonnectorModalFooter from './KonnectorModalFooter' import KonnectorModalFooter from './KonnectorModalFooter'
import './konnectorModal.scss' import './konnectorModal.scss'
...@@ -24,7 +25,7 @@ interface KonnectorModalProps { ...@@ -24,7 +25,7 @@ interface KonnectorModalProps {
open: boolean open: boolean
isUpdating: boolean isUpdating: boolean
/** Only used for SGE when searching for user identity */ /** Only used for SGE when searching for user identity */
isLogging: boolean isVerifyingIdentity: boolean
state: string | null state: string | null
error: KonnectorError | null error: KonnectorError | null
fluidType: FluidType fluidType: FluidType
...@@ -36,7 +37,7 @@ interface KonnectorModalProps { ...@@ -36,7 +37,7 @@ interface KonnectorModalProps {
const KonnectorModal = ({ const KonnectorModal = ({
open, open,
isUpdating, isUpdating,
isLogging, isVerifyingIdentity,
state, state,
error, error,
fluidType, fluidType,
...@@ -45,19 +46,21 @@ const KonnectorModal = ({ ...@@ -45,19 +46,21 @@ const KonnectorModal = ({
account, account,
}: KonnectorModalProps) => { }: KonnectorModalProps) => {
const { t } = useI18n() const { t } = useI18n()
const fluidName: string = FluidType[fluidType] const fluidName = getFluidName(fluidType)
const [index, setIndex] = useState<number>(0) const [index, setIndex] = useState<number>(0)
/** Only used for enedis to see common errors */
const [showCommonErrors, setShowCommonErrors] = useState(false)
const shuffledWaitingTexts = useMemo(() => { const shuffledWaitingTexts = useMemo(() => {
if (fluidType) { if (fluidType !== FluidType.ELECTRICITY) {
return shuffle(connectionWaitingText) return shuffle(connectionWaitingText)
} else {
return connectionWaitingText
} }
return connectionWaitingText
}, [fluidType]) }, [fluidType])
const firstConnectionWaitingTexts = firstConnectionWaitingText.concat( const firstConnectionWaitingTexts = firstConnectionWaitingText.concat(
...shuffledWaitingTexts ...shuffledWaitingTexts
) )
const [showCommonErrors, setShowCommonErrors] = useState(false)
const getUpdatingText = useCallback(() => { const getUpdatingText = useCallback(() => {
return ( return (
...@@ -80,7 +83,7 @@ const KonnectorModal = ({ ...@@ -80,7 +83,7 @@ const KonnectorModal = ({
const getConnectionText = useCallback(() => { const getConnectionText = useCallback(() => {
return ( return (
<div className="kmodal-waiting-text text-18-italic"> <div className="kmodal-waiting-text text-18-italic">
{isLogging ? ( {isVerifyingIdentity ? (
<p className="text-18-white">{t('konnector_modal.logging_txt')}</p> <p className="text-18-white">{t('konnector_modal.logging_txt')}</p>
) : ( ) : (
firstConnectionWaitingTexts.map((text, idx) => ( firstConnectionWaitingTexts.map((text, idx) => (
...@@ -97,20 +100,20 @@ const KonnectorModal = ({ ...@@ -97,20 +100,20 @@ const KonnectorModal = ({
)} )}
</div> </div>
) )
}, [firstConnectionWaitingTexts, index, isLogging, t]) }, [firstConnectionWaitingTexts, index, isVerifyingIdentity, t])
/** Returns connection success contents, depending on the fluid and update status */ /** Returns connection success contents, depending on the fluid and update status */
const connectionSuccessContent = () => ( const connectionSuccessContent = () => (
<div className="konnector-config"> <div className="konnector-config">
<Icon icon={successIcon} size={48} /> <Icon icon={successIcon} size={48} />
<div className="kcs-picto-txt text-20-bold"> <div className="headerSuccess text-20-bold">
{t(`konnector_modal.success_${isUpdating ? 'update_' : ''}txt`)} {t(`konnector_modal.success_${isUpdating ? 'update_' : ''}txt`)}
</div> </div>
<b> <b>
{t( {t(
`konnector_modal.success_data_${ `konnector_modal.success_data_${
isUpdating ? 'update_' : '' isUpdating ? 'update_' : ''
}${fluidName.toLowerCase()}` }${fluidName}`
)} )}
</b> </b>
<p <p
...@@ -119,7 +122,7 @@ const KonnectorModal = ({ ...@@ -119,7 +122,7 @@ const KonnectorModal = ({
__html: t( __html: t(
`konnector_modal.success_data_additional_${ `konnector_modal.success_data_additional_${
isUpdating ? 'update_' : '' isUpdating ? 'update_' : ''
}${fluidName.toLowerCase()}` }${fluidName}`
), ),
}} }}
/> />
...@@ -156,11 +159,13 @@ const KonnectorModal = ({ ...@@ -156,11 +159,13 @@ const KonnectorModal = ({
{t('konnector_modal.accessibility.window_title')} {t('konnector_modal.accessibility.window_title')}
</div> </div>
<div className="kmodal-content"> <div className="kmodal-content">
{open && !state ? ( {/* NEITHER ERROR NOR SUCCESS => LOADING */}
{!state ? (
<> <>
<Loader fluidType={fluidType} /> <Loader fluidType={fluidType} />
{!isLogging && ( {!isVerifyingIdentity && (
<div className="kmodal-content-text kmodal-content-text-center text-16-normal"> <div className="kmodal-content-text text-16-normal">
{/* TODO remove kc-wait */}
<div className="kc-wait text-16-bold"> <div className="kc-wait text-16-bold">
{t( {t(
`konnector_modal.loading_data${isUpdating ? '_update' : ''}` `konnector_modal.loading_data${isUpdating ? '_update' : ''}`
...@@ -173,6 +178,7 @@ const KonnectorModal = ({ ...@@ -173,6 +178,7 @@ const KonnectorModal = ({
</> </>
) : ( ) : (
<> <>
{/* ERROR OR SUCCESS */}
<div className="kmodal-info"> <div className="kmodal-info">
{state === ERROR_EVENT && ( {state === ERROR_EVENT && (
<> <>
...@@ -180,35 +186,34 @@ const KonnectorModal = ({ ...@@ -180,35 +186,34 @@ const KonnectorModal = ({
// LOGIN FAILED FOR ENEDIS AND EGL // LOGIN FAILED FOR ENEDIS AND EGL
<div className="konnector-config"> <div className="konnector-config">
<Icon icon={errorIcon} size={48} /> <Icon icon={errorIcon} size={48} />
<div className="kce-picto-txt text-20-bold"> <div className="headerError text-20-bold">
{t('konnector_modal.error_txt')} {t('konnector_modal.error_txt')}
</div> </div>
<div> <div>
{t( {t(
`konnector_modal.error_credentials_${ `konnector_modal.error_credentials_${
isUpdating ? 'update_' : '' isUpdating ? 'update_' : ''
}${fluidName.toLowerCase()}` }${fluidName}`
)} )}
</div> </div>
{fluidType === FluidType.ELECTRICITY && !isUpdating && ( {fluidType === FluidType.ELECTRICITY && !isUpdating && (
<div className="elec-fail"> <div className="elec-fail">
{t( {t(
`konnector_modal.error_credentials_${fluidName.toLowerCase()}_2` `konnector_modal.error_credentials_${fluidName}_2`
)} )}
</div> </div>
)} )}
{/* Show common errors */} {/* Show common errors for enedis */}
{fluidType === FluidType.ELECTRICITY && ( {fluidType === FluidType.ELECTRICITY && (
<> <>
{!showCommonErrors && ( {!showCommonErrors ? (
<Button <Button
className="btnText commonErrors" className="btnText"
onClick={() => setShowCommonErrors(true)} onClick={() => setShowCommonErrors(true)}
> >
{t('konnector_modal.show_common_error')} {t('konnector_modal.show_common_error')}
</Button> </Button>
)} ) : (
{showCommonErrors && (
<div <div
className="commonErrorsList" className="commonErrorsList"
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
...@@ -226,7 +231,7 @@ const KonnectorModal = ({ ...@@ -226,7 +231,7 @@ const KonnectorModal = ({
isUpdating && isUpdating &&
fluidType === FluidType.ELECTRICITY && ( fluidType === FluidType.ELECTRICITY && (
// MISMATCH UPDATE ERROR ENEDIS // MISMATCH UPDATE ERROR ENEDIS
<div className="kce-picto-txt konnector-config mismatch"> <div className="headerError konnector-config mismatch">
<Icon icon={EnedisIcon} width={120} height={80} /> <Icon icon={EnedisIcon} width={120} height={80} />
<div className="title text-20-bold"> <div className="title text-20-bold">
{t('konnector_modal.mismatch.title')} {t('konnector_modal.mismatch.title')}
...@@ -242,41 +247,37 @@ const KonnectorModal = ({ ...@@ -242,41 +247,37 @@ const KonnectorModal = ({
</div> </div>
</div> </div>
)} )}
{error === KonnectorError.CHALLENGE_ASKED && {error ===
KonnectorError.USER_ACTION_NEEDED_ACCOUNT_REMOVED &&
fluidType === FluidType.GAS && ( fluidType === FluidType.GAS && (
// CONSENT FORM ERROR GRDF
<div className="konnector-config"> <div className="konnector-config">
<Icon icon={errorIcon} size={48} /> <Icon icon={errorIcon} size={48} />
<div className="kce-picto-txt text-20-bold"> <div className="headerError text-20-bold">
{t('konnector_modal.error_txt')} {t('konnector_modal.error_txt')}
</div> </div>
<div className="title text-20-bold"> <div className="title text-16-bold">
{t('konnector_modal.error_consent_form_gas_title')} {t('konnector_modal.error_consent_form_gas_title')}
</div> </div>
<div className="err-data-2"> <div className="err-data-2">
{t('konnector_modal.error_consent_form_gas_content')} {t('konnector_modal.error_consent_form_gas_report')}
</div>
<div className="err-data-2">
{t(
'konnector_modal.error_consent_form_gas_content_2'
)}
</div> </div>
</div> </div>
)} )}
{error !== KonnectorError.LOGIN_FAILED && {error !== KonnectorError.LOGIN_FAILED &&
error !== KonnectorError.TERMS_VERSION_MISMATCH && error !== KonnectorError.TERMS_VERSION_MISMATCH &&
error !== KonnectorError.CHALLENGE_ASKED && ( error !==
KonnectorError.USER_ACTION_NEEDED_ACCOUNT_REMOVED && (
// DEFAULT CASE // DEFAULT CASE
<div className="konnector-config"> <div className="konnector-config">
<Icon icon={errorIcon} size={48} /> <Icon icon={errorIcon} size={48} />
<div className="kce-picto-txt text-20-bold"> <div className="headerError text-20-bold">
{t('konnector_modal.error_txt')} {t('konnector_modal.error_txt')}
</div> </div>
<div> <div>
{t( {t(
`konnector_modal.error_data_${ `konnector_modal.error_data_${
isUpdating ? 'update_' : '' isUpdating ? 'update_' : ''
}${fluidName.toLowerCase()}` }${fluidName}`
)} )}
</div> </div>
<div className="err-data-2"> <div className="err-data-2">
......
import Button from '@material-ui/core/Button' import Button from '@material-ui/core/Button'
import { useClient } from 'cozy-client' import { useClient } from 'cozy-client'
import { import { SUCCESS_EVENT } from 'cozy-harvest-lib/dist/models/flowEvents'
ERROR_EVENT,
SUCCESS_EVENT,
} from 'cozy-harvest-lib/dist/models/flowEvents'
import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { useI18n } from 'cozy-ui/transpiled/react/I18n'
import { KonnectorError } from 'enums' import { KonnectorError } from 'enums'
import { Account } from 'models' import { Account } from 'models'
...@@ -12,6 +9,8 @@ import { useNavigate } from 'react-router-dom' ...@@ -12,6 +9,8 @@ import { useNavigate } from 'react-router-dom'
import AccountService from 'services/account.service' import AccountService from 'services/account.service'
import './konnectorModal.scss' import './konnectorModal.scss'
declare let __SAU_ISSUE_DIRECT_LINK__: string
interface KonnectorModalFooterProps { interface KonnectorModalFooterProps {
state: string | null state: string | null
error: KonnectorError | null error: KonnectorError | null
...@@ -32,6 +31,7 @@ const KonnectorModalFooter = ({ ...@@ -32,6 +31,7 @@ const KonnectorModalFooter = ({
const { t } = useI18n() const { t } = useI18n()
const client = useClient() const client = useClient()
const navigate = useNavigate() const navigate = useNavigate()
const handleSGELoginRetry = useCallback(() => { const handleSGELoginRetry = useCallback(() => {
handleCloseClick(state === SUCCESS_EVENT) handleCloseClick(state === SUCCESS_EVENT)
navigate('/connect/electricity') navigate('/connect/electricity')
...@@ -46,73 +46,87 @@ const KonnectorModalFooter = ({ ...@@ -46,73 +46,87 @@ const KonnectorModalFooter = ({
} }
}, [account, client, handleAccountDeletion, navigate]) }, [account, client, handleAccountDeletion, navigate])
const defaultButton = ( if (error === KonnectorError.USER_ACTION_NEEDED) {
<Button // INSEE CODE ERROR ENEDIS
aria-label={t('konnector_modal.accessibility.button_close')} return (
onClick={() => handleCloseClick(state === SUCCESS_EVENT)} <Button
className="btnPrimary" aria-label={t('konnector_modal.accessibility.button_close')}
> onClick={() => handleCloseClick(state === SUCCESS_EVENT)}
<div>{t('konnector_modal.button_validate')}</div> className="btnPrimary"
</Button> >
) <div>{t('konnector_modal.button_understood')}</div>
</Button>
const errorButtons = () => { )
switch (error) { } else if (error === KonnectorError.LOGIN_FAILED) {
case KonnectorError.USER_ACTION_NEEDED: // INCOMPLETE CONSENT FORM - GRDF // what is this comment ?
// INSEE CODE ERROR ENEDIS return (
return ( <Button
<Button aria-label={t('konnector_modal.accessibility.button_close')}
aria-label={t('konnector_modal.accessibility.button_close')} onClick={() => handleCloseClick(state === SUCCESS_EVENT)}
onClick={() => handleCloseClick(state === SUCCESS_EVENT)} className="btnPrimary"
className="btnPrimary" >
> <div>{t('konnector_modal.button_try_again')}</div>
<div>{t('konnector_modal.button_understood')}</div> </Button>
</Button> )
) } else if (error === KonnectorError.CHALLENGE_ASKED) {
case KonnectorError.LOGIN_FAILED: return (
case KonnectorError.CHALLENGE_ASKED: <Button
// INCOMPLETE CONSENT FORM - GRDF aria-label={t('konnector_modal.accessibility.button_close')}
return ( onClick={() => handleCloseClick(state === SUCCESS_EVENT)}
<Button className="btnPrimary"
aria-label={t('konnector_modal.accessibility.button_close')} >
onClick={() => handleCloseClick(state === SUCCESS_EVENT)} <div>{t('konnector_modal.button_come_back_later')}</div>
className="btnPrimary" </Button>
> )
<div>{t('konnector_modal.button_try_again')}</div> } else if (error === KonnectorError.TERMS_VERSION_MISMATCH) {
</Button> return (
) <div className="buttons">
case KonnectorError.TERMS_VERSION_MISMATCH: <Button
return ( aria-label={t('konnector_modal.accessibility.button_close')}
<div className="buttons"> onClick={() => handleCloseClick(state === SUCCESS_EVENT)}
<Button className="btnSecondary"
aria-label={t('konnector_modal.accessibility.button_close')} >
onClick={() => handleCloseClick(state === SUCCESS_EVENT)} <div>{t('konnector_modal.button_later')}</div>
className="btnSecondary" </Button>
> <Button
<div>{t('konnector_modal.button_later')}</div> aria-label={t('konnector_modal.accessibility.button_close')}
</Button> onClick={!isUpdating ? handleSGELoginRetry : handleResetSGEAccount}
<Button className="btnPrimary"
aria-label={t('konnector_modal.accessibility.button_close')} >
onClick={ <div>
!isUpdating ? handleSGELoginRetry : handleResetSGEAccount {!isUpdating
} ? t('konnector_modal.button_check_info')
className="btnPrimary" : t('konnector_modal.button_go')}
>
<div>
{!isUpdating
? t('konnector_modal.button_check_info')
: t('konnector_modal.button_go')}
</div>
</Button>
</div> </div>
) </Button>
default: </div>
// DEFAULT FOOTER BUTTONS )
return defaultButton } else if (error === KonnectorError.USER_ACTION_NEEDED_ACCOUNT_REMOVED) {
} return (
<Button
aria-label={t('konnector_modal.accessibility.button_close')}
onClick={() => {
window.open(
`${__SAU_ISSUE_DIRECT_LINK__}?version=${client.appMetadata.version}`
)
handleCloseClick(state === SUCCESS_EVENT)
}}
className="btnPrimary"
>
<div>{t('konnector_modal.button_contact')}</div>
</Button>
)
} else {
return (
<Button
aria-label={t('konnector_modal.accessibility.button_close')}
onClick={() => handleCloseClick(state === SUCCESS_EVENT)}
className="btnPrimary"
>
<div>{t('konnector_modal.button_validate')}</div>
</Button>
)
} }
return <>{state === ERROR_EVENT ? errorButtons() : defaultButton}</>
} }
export default KonnectorModalFooter export default KonnectorModalFooter
...@@ -12,7 +12,6 @@ import OfflinePicto from 'assets/icons/visu/offline-param.svg' ...@@ -12,7 +12,6 @@ import OfflinePicto from 'assets/icons/visu/offline-param.svg'
import classNames from 'classnames' import classNames from 'classnames'
import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
import Connection from 'components/Connection/Connection' import Connection from 'components/Connection/Connection'
import { GrdfWaitConsent } from 'components/Connection/GRDFConnect/GrdfWaitConsent'
import KonnectorModal from 'components/Konnector/KonnectorModal' import KonnectorModal from 'components/Konnector/KonnectorModal'
import { useClient } from 'cozy-client' import { useClient } from 'cozy-client'
import { isKonnectorRunning } from 'cozy-harvest-lib/dist/helpers/triggers' import { isKonnectorRunning } from 'cozy-harvest-lib/dist/helpers/triggers'
...@@ -54,27 +53,24 @@ import { ...@@ -54,27 +53,24 @@ import {
updateFluidConnection, updateFluidConnection,
} from 'store/global/global.slice' } from 'store/global/global.slice'
import { useAppDispatch, useAppSelector } from 'store/hooks' import { useAppDispatch, useAppSelector } from 'store/hooks'
import logApp from 'utils/logger'
import { getParamPicto } from 'utils/picto' import { getParamPicto } from 'utils/picto'
import { getKonnectorSlug } from 'utils/utils' import { getKonnectorSlug } from 'utils/utils'
import ConnectionNotFound from './ConnectionNotFound/ConnectionNotFound' import ConnectionNotFound from './ConnectionNotFound/ConnectionNotFound'
import ConnectionResult from './ConnectionResult/ConnectionResult' import ConnectionResult from './ConnectionResult/ConnectionResult'
import './konnectorViewerCard.scss' import './konnectorViewerCard.scss'
interface KonnectorViewerCardProps {
showOfflineData: boolean
fluidType: FluidType
}
const KonnectorViewerCard = ({ const KonnectorViewerCard = ({
showOfflineData,
fluidType, fluidType,
}: KonnectorViewerCardProps) => { }: {
fluidType: Exclude<FluidType, FluidType.MULTIFLUID>
}) => {
const { t } = useI18n() const { t } = useI18n()
const client = useClient() const client = useClient()
const navigate = useNavigate() const navigate = useNavigate()
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const { const {
chart: { showConnectionDetails }, chart: { showConnectionDetails, showOfflineData },
challenge: { currentChallenge }, challenge: { currentChallenge },
global: { fluidStatus, shouldRefreshConsent, partnersInfo }, global: { fluidStatus, shouldRefreshConsent, partnersInfo },
} = useAppSelector(state => state.ecolyo) } = useAppSelector(state => state.ecolyo)
...@@ -83,26 +79,27 @@ const KonnectorViewerCard = ({ ...@@ -83,26 +79,27 @@ const KonnectorViewerCard = ({
const fluidState = currentFluidStatus.status const fluidState = currentFluidStatus.status
const { konnector, account, trigger } = currentFluidStatus.connection const { konnector, account, trigger } = currentFluidStatus.connection
const currentFluidName = FluidType[currentFluidStatus.fluidType].toLowerCase() const currentFluidName = FluidType[currentFluidStatus.fluidType].toLowerCase()
const [openModal, setOpenModal] = useState(false) const [openModal, setOpenModal] = useState(false)
const [isUpdating, setIsUpdating] = useState(false) const [isUpdating, setIsUpdating] = useState(false)
const [isLogging, setIsLogging] = useState( const [isVerifyingIdentity, setIsVerifyingIdentity] = useState(
fluidType === FluidType.ELECTRICITY fluidType === FluidType.ELECTRICITY
) )
const [konnectorErrorDescription, setKonnectorErrorDescription] = const [konnectorErrorDescription, setKonnectorErrorDescription] =
useState<KonnectorError | null>(null) useState<KonnectorError | null>(null)
const [konnectorState, setKonnectorState] = useState<string | null>(null) const [konnectorState, setKonnectorState] = useState<string | null>(null)
const [isOutdatedData, setIsOutdatedData] = useState<number | null>(null) const [isOutdatedData, setIsOutdatedData] = useState<number | null>(null)
const isWaitingForConsent =
fluidType === FluidType.GAS &&
currentFluidStatus.status === FluidState.CHALLENGE_ASKED
const fluidService = useMemo(() => new FluidService(client), [client]) const fluidService = useMemo(() => new FluidService(client), [client])
const partnersInfoService = useMemo( const partnersInfoService = useMemo(
() => new PartnersInfoService(client), () => new PartnersInfoService(client),
[client] [client]
) )
const lastDataDate =
fluidType !== FluidType.MULTIFLUID && currentFluidStatus.lastDataDate
? currentFluidStatus.lastDataDate.toLocaleString() + fluidType
: fluidType
const iconType = getParamPicto(currentFluidStatus.fluidType) const iconType = getParamPicto(currentFluidStatus.fluidType)
const toggleAccordion = () => { const toggleAccordion = () => {
...@@ -112,19 +109,19 @@ const KonnectorViewerCard = ({ ...@@ -112,19 +109,19 @@ const KonnectorViewerCard = ({
const updateGlobalFluidStatus = useCallback(async (): Promise< const updateGlobalFluidStatus = useCallback(async (): Promise<
FluidStatus[] FluidStatus[]
> => { > => {
const _updatedFluidStatus = await fluidService.getFluidStatus() const updatedFluidStatus = await fluidService.getFluidStatus()
const refDate = DateTime.fromISO('0001-01-01') const refDate = DateTime.fromISO('0001-01-01')
let _lastDataDate = DateTime.fromISO('0001-01-01') let lastDataDate = DateTime.fromISO('0001-01-01')
for (const fluid of _updatedFluidStatus) { for (const fluid of updatedFluidStatus) {
if (fluid?.lastDataDate && fluid?.lastDataDate > _lastDataDate) { if (fluid?.lastDataDate && fluid?.lastDataDate > lastDataDate) {
_lastDataDate = fluid.lastDataDate lastDataDate = fluid.lastDataDate
} }
} }
if (_lastDataDate > refDate) { if (lastDataDate > refDate) {
dispatch(setSelectedDate(_lastDataDate)) dispatch(setSelectedDate(lastDataDate))
} }
return _updatedFluidStatus return updatedFluidStatus
}, [dispatch, fluidService]) }, [dispatch, fluidService])
const refreshChallengeState = useCallback(async () => { const refreshChallengeState = useCallback(async () => {
...@@ -173,9 +170,10 @@ const KonnectorViewerCard = ({ ...@@ -173,9 +170,10 @@ const KonnectorViewerCard = ({
const isGlobalLoginFailed = const isGlobalLoginFailed =
konnectorErrorDescription === KonnectorError.LOGIN_FAILED || konnectorErrorDescription === KonnectorError.LOGIN_FAILED ||
konnectorErrorDescription === KonnectorError.UNKNOWN_ERROR || konnectorErrorDescription === KonnectorError.UNKNOWN_ERROR ||
konnectorErrorDescription === KonnectorError.CHALLENGE_ASKED ||
konnectorErrorDescription === KonnectorError.CRITICAL || konnectorErrorDescription === KonnectorError.CRITICAL ||
konnectorErrorDescription === KonnectorError.MISSING_SECRET konnectorErrorDescription === KonnectorError.MISSING_SECRET ||
konnectorErrorDescription ===
KonnectorError.USER_ACTION_NEEDED_ACCOUNT_REMOVED
// CASE FOR ENEDIS CODE INSEE ERROR // CASE FOR ENEDIS CODE INSEE ERROR
const isEnedisCodeInseeError = const isEnedisCodeInseeError =
...@@ -189,25 +187,21 @@ const KonnectorViewerCard = ({ ...@@ -189,25 +187,21 @@ const KonnectorViewerCard = ({
(isGlobalLoginFailed || isEnedisCodeInseeError) (isGlobalLoginFailed || isEnedisCodeInseeError)
if (shouldDeleteAccount) { if (shouldDeleteAccount) {
logApp('info', `shouldDeleteAccount`)
// KEEP LAST LOGIN FOR EPGL // KEEP LAST LOGIN FOR EPGL
let lastEpglLogin = ''
if ( if (
fluidSlug === FluidSlugType.WATER && fluidSlug === FluidSlugType.WATER &&
currentFluidStatus.connection.account?.auth currentFluidStatus.connection.account?.auth
) { ) {
const auth = currentFluidStatus.connection.account const auth = currentFluidStatus.connection.account
.auth as AccountEGLData .auth as AccountEGLData
lastEpglLogin = auth.login const lastEpglLogin = auth.login
dispatch(setLastEpglLogin(lastEpglLogin))
} }
// DELETE ACCOUNT // DELETE ACCOUNT
const accountService = new AccountService(client) const accountService = new AccountService(client)
await accountService.deleteAccount(account) await accountService.deleteAccount(account)
await handleAccountDeletion() await handleAccountDeletion()
// RESTORE LAST KNOWN CREDENTIALS
if (lastEpglLogin) {
dispatch(setLastEpglLogin(lastEpglLogin))
}
} else { } else {
const updatedFluidStatus = const updatedFluidStatus =
await fluidService.getFluidStatus(partnersInfo) await fluidService.getFluidStatus(partnersInfo)
...@@ -249,12 +243,6 @@ const KonnectorViewerCard = ({ ...@@ -249,12 +243,6 @@ const KonnectorViewerCard = ({
}, [dispatch, fluidType, navigate]) }, [dispatch, fluidType, navigate])
const getConnectionCard = useCallback(() => { const getConnectionCard = useCallback(() => {
if (
fluidType === FluidType.GAS &&
fluidState === FluidState.CHALLENGE_ASKED
) {
return <GrdfWaitConsent />
}
if (showOfflineData && !account) { if (showOfflineData && !account) {
return ( return (
<Button className="btnPrimary" onClick={toggleModalConnection}> <Button className="btnPrimary" onClick={toggleModalConnection}>
...@@ -262,35 +250,32 @@ const KonnectorViewerCard = ({ ...@@ -262,35 +250,32 @@ const KonnectorViewerCard = ({
</Button> </Button>
) )
} }
if (fluidState === FluidState.KONNECTOR_NOT_FOUND && !isUpdating) { if (fluidState === FluidState.KONNECTOR_NOT_FOUND && !isUpdating) {
return <ConnectionNotFound konnectorSlug={fluidSlug} /> return <ConnectionNotFound konnectorSlug={fluidSlug} />
} }
// Handle login failed for EGL // Handle login failed for EGL
else if ( if (
(fluidType === FluidType.WATER && (fluidType === FluidType.WATER &&
fluidState === FluidState.ERROR_LOGIN_FAILED) || fluidState === FluidState.LOGIN_FAILED) ||
(account && currentFluidStatus.status !== FluidState.NOT_CONNECTED) (account && currentFluidStatus.status !== FluidState.NOT_CONNECTED)
) { ) {
return ( return (
<ConnectionResult <ConnectionResult
handleAccountDeletion={handleAccountDeletion} handleAccountDeletion={handleAccountDeletion}
fluidType={fluidType} fluidType={fluidType}
key={lastDataDate}
/> />
) )
} else {
return <Connection fluidType={currentFluidStatus.fluidType} />
} }
}, [ }, [
account, account,
currentFluidStatus.fluidType,
currentFluidStatus.status, currentFluidStatus.status,
fluidSlug, fluidSlug,
fluidState, fluidState,
fluidType, fluidType,
handleAccountDeletion, handleAccountDeletion,
isUpdating, isUpdating,
lastDataDate,
showOfflineData, showOfflineData,
t, t,
toggleModalConnection, toggleModalConnection,
...@@ -325,63 +310,38 @@ const KonnectorViewerCard = ({ ...@@ -325,63 +310,38 @@ const KonnectorViewerCard = ({
] ]
) )
const getIconForStatus = ( /** Display konnector icon & its smaller status icon in upper left corner */
status: FluidState, const displayKonnectorIcon = useCallback(() => {
maintenance: boolean, const { maintenance, status, connection } = currentFluidStatus
connection: FluidConnection, let statusIcon = null
outdatedData: number | null
) => {
if (maintenance) {
return (
<StyledIcon
icon={PartnersIssueNotif}
size={24}
className="konnector-state-picto"
/>
)
}
if ( if (maintenance) {
(status === FluidState.ERROR || statusIcon = PartnersIssueNotif
status === FluidState.ERROR_LOGIN_FAILED) && } else if (
(status === FluidState.ERROR || status === FluidState.LOGIN_FAILED) &&
connection.account connection.account
) { ) {
return ( statusIcon = ErrorNotif
<StyledIcon } else if (isWaitingForConsent || (isOutdatedData && isOutdatedData > 0)) {
icon={ErrorNotif} statusIcon = WarningNotif
size={24}
className="konnector-state-picto"
/>
)
} }
if (outdatedData && outdatedData > 0) {
return (
<StyledIcon
icon={WarningNotif}
size={24}
className="konnector-state-picto"
/>
)
}
}
const displayKonnectorIcon = useCallback(() => {
return ( return (
<div className="konnector-icon"> <div className="konnector-icon">
<Icon <Icon
icon={currentFluidStatus.connection.account ? iconType : OfflinePicto} icon={currentFluidStatus.connection.account ? iconType : OfflinePicto}
size={49} size={49}
/> />
{getIconForStatus( {statusIcon && (
currentFluidStatus.status, <StyledIcon
currentFluidStatus.maintenance, icon={statusIcon}
currentFluidStatus.connection, size={24}
isOutdatedData className="konnector-state-picto"
/>
)} )}
</div> </div>
) )
}, [currentFluidStatus, iconType, isOutdatedData]) }, [currentFluidStatus, iconType, isOutdatedData, isWaitingForConsent])
const displayKonnectorHeader = useCallback(() => { const displayKonnectorHeader = useCallback(() => {
if (currentFluidStatus.maintenance) { if (currentFluidStatus.maintenance) {
...@@ -452,7 +412,7 @@ const KonnectorViewerCard = ({ ...@@ -452,7 +412,7 @@ const KonnectorViewerCard = ({
callbackResponse(ERROR_EVENT) callbackResponse(ERROR_EVENT)
}) })
connectionFlow.jobWatcher.on(LOGIN_SUCCESS_EVENT, () => { connectionFlow.jobWatcher.on(LOGIN_SUCCESS_EVENT, () => {
setIsLogging(false) setIsVerifyingIdentity(false)
}) })
connectionFlow.jobWatcher.on(SUCCESS_EVENT, () => { connectionFlow.jobWatcher.on(SUCCESS_EVENT, () => {
callbackResponse(SUCCESS_EVENT) callbackResponse(SUCCESS_EVENT)
...@@ -486,21 +446,18 @@ const KonnectorViewerCard = ({ ...@@ -486,21 +446,18 @@ const KonnectorViewerCard = ({
return ( return (
<div className="konnector-section-root"> <div className="konnector-section-root">
{!showOfflineData && ( {!showOfflineData && <Connection fluidType={fluidType} />}
<AccordionDetails>{getConnectionCard()}</AccordionDetails>
)}
{showOfflineData && ( {showOfflineData && (
<Accordion <Accordion
expanded={showConnectionDetails} expanded={showConnectionDetails}
onChange={toggleAccordion} onChange={toggleAccordion}
classes={{ classes={{
root: `expansion-panel-root ${ root: classNames('expansion-panel-root', {
!currentFluidStatus.maintenance && ['red-border']:
(currentFluidStatus.status === FluidState.ERROR || !currentFluidStatus.maintenance &&
currentFluidStatus.status === FluidState.ERROR_LOGIN_FAILED) (currentFluidStatus.status === FluidState.ERROR ||
? 'red-border' currentFluidStatus.status === FluidState.LOGIN_FAILED),
: '' }),
}`,
}} }}
> >
<AccordionSummary <AccordionSummary
...@@ -538,10 +495,10 @@ const KonnectorViewerCard = ({ ...@@ -538,10 +495,10 @@ const KonnectorViewerCard = ({
<KonnectorModal <KonnectorModal
open={openModal} open={openModal}
isUpdating={isUpdating} isUpdating={isUpdating}
isLogging={isLogging} isVerifyingIdentity={isVerifyingIdentity}
state={konnectorState} state={konnectorState}
error={konnectorErrorDescription} error={konnectorErrorDescription}
fluidType={currentFluidStatus.fluidType} fluidType={fluidType}
handleCloseClick={handleConnectionEnd} handleCloseClick={handleConnectionEnd}
handleAccountDeletion={handleAccountDeletion} handleAccountDeletion={handleAccountDeletion}
account={account} account={account}
......
...@@ -11,8 +11,9 @@ import './konnectorViewerCard.scss' ...@@ -11,8 +11,9 @@ import './konnectorViewerCard.scss'
const KonnectorViewerList = () => { const KonnectorViewerList = () => {
const { t } = useI18n() const { t } = useI18n()
const { fluidStatus } = useAppSelector(state => state.ecolyo.global)
const navigate = useNavigate() const navigate = useNavigate()
const { fluidStatus } = useAppSelector(state => state.ecolyo.global)
const goToFluid = (fluidType: FluidType) => { const goToFluid = (fluidType: FluidType) => {
navigate(`/consumption/${getFluidName(fluidType)}`) navigate(`/consumption/${getFluidName(fluidType)}`)
} }
......
...@@ -62,7 +62,7 @@ exports[`KonnectorModal component should be rendered correctly 1`] = ` ...@@ -62,7 +62,7 @@ exports[`KonnectorModal component should be rendered correctly 1`] = `
</div> </div>
</div> </div>
<div <div
class="kmodal-content-text kmodal-content-text-center text-16-normal" class="kmodal-content-text text-16-normal"
> >
<div <div
class="kc-wait text-16-bold" class="kc-wait text-16-bold"
......
...@@ -38,16 +38,14 @@ ...@@ -38,16 +38,14 @@
} }
} }
.kmodal-content-text-center {
text-align: center;
}
.kmodal-info { .kmodal-info {
padding: 1rem; padding: 1rem;
text-align: center; display: flex;
flex-direction: column;
gap: 1rem;
.buttons { .buttons {
display: flex; display: flex;
gap: 0.825rem; gap: 1rem;
} }
.konnector-config { .konnector-config {
align-items: center; align-items: center;
...@@ -58,32 +56,22 @@ ...@@ -58,32 +56,22 @@
gap: 1rem; gap: 1rem;
.elec-fail { .elec-fail {
color: $grey-bright; color: $grey-bright;
margin-top: 1rem;
} }
&.mismatch { &.mismatch {
.title { .title {
color: $orange; color: $orange;
} }
div {
margin-bottom: 1rem;
}
.info { .info {
color: $grey-bright; color: $grey-bright;
} }
} }
.kce-picto-txt { .headerSuccess {
color: $red-primary;
}
.kcs-picto-txt {
color: $multi-color; color: $multi-color;
} }
.headerError {
.commonErrors { color: $red-primary;
text-decoration: underline;
cursor: pointer;
margin: 1rem auto 0.5rem;
} }
.commonErrorsList { .commonErrorsList {
text-align: left; text-align: left;
span { span {
...@@ -104,10 +92,6 @@ ...@@ -104,10 +92,6 @@
} }
} }
} }
button {
margin-top: 1rem;
}
} }
} }
......
...@@ -35,7 +35,7 @@ const ReportOptions = () => { ...@@ -35,7 +35,7 @@ const ReportOptions = () => {
const isWaterConnected = const isWaterConnected =
fluidStatus[FluidType.WATER].status !== FluidState.NOT_CONNECTED && fluidStatus[FluidType.WATER].status !== FluidState.NOT_CONNECTED &&
fluidStatus[FluidType.WATER].status !== FluidState.KONNECTOR_NOT_FOUND && fluidStatus[FluidType.WATER].status !== FluidState.KONNECTOR_NOT_FOUND &&
fluidStatus[FluidType.WATER].status !== FluidState.ERROR_LOGIN_FAILED fluidStatus[FluidType.WATER].status !== FluidState.LOGIN_FAILED
const setWaterLimit = ( const setWaterLimit = (
e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement, Element> e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement, Element>
......
...@@ -6,10 +6,10 @@ export enum FluidType { ...@@ -6,10 +6,10 @@ export enum FluidType {
} }
export enum FluidState { export enum FluidState {
KONNECTOR_NOT_FOUND = 0, KONNECTOR_NOT_FOUND = 'KONNECTOR_NOT_FOUND',
NOT_CONNECTED = 1, NOT_CONNECTED = 'NOT_CONNECTED',
DONE = 200, DONE = 'DONE',
ERROR = 300, ERROR = 'ERROR',
ERROR_LOGIN_FAILED = 301, LOGIN_FAILED = 'LOGIN_FAILED',
CHALLENGE_ASKED = 400, CHALLENGE_ASKED = 'CHALLENGE_ASKED',
} }