Newer
Older
import classNames from 'classnames'
import ExpiredConsentModal from 'components/Connection/ExpiredConsentModal'
import SgeConnectView from 'components/Connection/SGEConnect/SgeConnectView'
import Content from 'components/Content/Content'
import CustomPopupModal from 'components/CustomPopup/CustomPopupModal'
import DateNavigator from 'components/DateNavigator/DateNavigator'
import FluidChart from 'components/FluidChart/FluidChart'
import CozyBar from 'components/Header/CozyBar'
import Header from 'components/Header/Header'
import ConsumptionDetails from 'components/Home/ConsumptionDetails'
import FluidButtons from 'components/Home/FluidButtons'
import KonnectorViewerCard from 'components/Konnector/KonnectorViewerCard'
import KonnectorViewerList from 'components/Konnector/KonnectorViewerList'
import Loader from 'components/Loader/Loader'
import PartnersIssueModal from 'components/PartnersIssue/PartnersIssueModal'
import { useClient } from 'cozy-client'
import { FluidType } from 'enum/fluid.enum'
import { TimeStep } from 'enum/timeStep.enum'
import React, { useCallback, useEffect, useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { useHistory } from 'react-router-dom'
import { AppStore } from 'store'
import { setCurrentTimeStep } from 'store/chart/chart.actions'
import {
setCustomPopup,
setPartnersIssue,
showReleaseNotes,
} from 'store/global/global.actions'
import {
getKonnectorUpdateError,
getTodayDate,
isKonnectorActive,
} from 'utils/utils'
import './consumptionView.scss'
import ReleaseNotesModal from './ReleaseNotesModal'
interface ConsumptionViewProps {
fluidType: FluidType
}
const ConsumptionView: React.FC<ConsumptionViewProps> = ({
fluidType,
}: ConsumptionViewProps) => {
const history = useHistory()
const isMulti = fluidType !== FluidType.MULTIFLUID
chart: { currentTimeStep, loading },
global: {
fluidStatus,
releaseNotes,
customPopupModal,
openPartnersIssueModal,
sgeConnect,
},
} = useSelector((state: AppStore) => state.ecolyo)

Hugo NOUTS
committed
const [isFluidKonnected, setIsFluidKonnected] = useState<boolean>(false)

Hugo NOUTS
committed
const [openReleaseNoteModal, setOpenReleaseNoteModal] = useState<boolean>(
releaseNotes.show
)
const [headerHeight, setHeaderHeight] = useState<number>(0)

Guilhem CARRON
committed
const [active, setActive] = useState<boolean>(false)
const [openExpiredConsentModal, setopenExpiredConsentModal] =
useState<boolean>(true)

Guilhem CARRON
committed
const [consentExpiredFluids, setconsentExpiredFluids] = useState<FluidType[]>(
[]
)

Guilhem CARRON
committed
const updatekey =
fluidType !== FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate
? `${fluidStatus[fluidType].lastDataDate!.toLocaleString()} + ${
fluidStatus[fluidType].status + fluidType
}`
: ''
const lastDataDateKey =
fluidType !== FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate
? `${fluidStatus[fluidType].lastDataDate!.toLocaleString() + fluidType}`

Guilhem CARRON
committed
const defineHeaderHeight = useCallback((height: number) => {
setHeaderHeight(height)
}, [])
const handleCloseReleaseNoteModal = useCallback(() => {
setOpenReleaseNoteModal(false)
dispatch(
showReleaseNotes(false, releaseNotes.notes, releaseNotes.redirectLink)
)
if (releaseNotes.redirectLink) {
history.push(releaseNotes.redirectLink)
}
}, [dispatch, history, releaseNotes.notes, releaseNotes.redirectLink])

Hugo NOUTS
committed
const handleCloseModal = useCallback(async () => {
const profileService = new ProfileService(client)
const updatedProfile = await profileService.updateProfile({
})
if (updatedProfile) {
dispatch(setPartnersIssue(false))
}
}, [client, dispatch])
const handleCloseCustomPopupModal = async () => {
const profileService = new ProfileService(client)
const updatedProfile = await profileService.updateProfile({
customPopupDate: getTodayDate(),
})
if (updatedProfile) {
dispatch(
setCustomPopup({
...customPopupModal,
popupEnabled: false,
})
)
}
}
useEffect(() => {
setIsFluidKonnected(isKonnectorActive(fluidStatus, fluidType))
if (
fluidType !== FluidType.ELECTRICITY &&
currentTimeStep == TimeStep.HALF_AN_HOUR
) {
dispatch(setCurrentTimeStep(TimeStep.WEEK))
}
}, [dispatch, fluidType, currentTimeStep, fluidStatus])

Guilhem CARRON
committed
useEffect(() => {
let subscribed = true
const expiredConsents: FluidType[] = []

Guilhem CARRON
committed
//Check if some fluids have expired consent error
for (const fluid of fluidStatus) {
const error = fluid.connection.triggerState?.last_error
if (error && getKonnectorUpdateError(error) === 'error_update_oauth') {

Guilhem CARRON
committed
expiredConsents.push(fluid.fluidType)
}
}

Guilhem CARRON
committed
if (subscribed) setconsentExpiredFluids(expiredConsents)
return () => {
subscribed = false
}
}, [fluidStatus])

Guilhem CARRON
committed
<CozyBar titleKey={'navigation.consumption'} />
<Header setHeaderHeight={defineHeaderHeight}>
<DateNavigator />
</Header>
<Content height={headerHeight}>
<FluidButtons activeFluid={fluidType} key={updatekey} />

Guilhem CARRON
committed

Hugo NOUTS
committed
{openReleaseNoteModal && (
<ReleaseNotesModal
open={openReleaseNoteModal}
handleCloseClick={handleCloseReleaseNoteModal}

Hugo NOUTS
committed
></ReleaseNotesModal>
)}
{isFluidKonnected ? (
<>
{loading && (
<div className={'consumptionview-loading'} aria-busy="true">
</div>
)}
<div
className={classNames('consumptionview-content', {
['--hidden']: loading,
})}
>

Guilhem CARRON
committed
<FluidChart
fluidType={fluidType}
setActive={setActive}

Guilhem CARRON
committed
/>
<ConsumptionDetails fluidType={fluidType} />
</div>
<div className="konnector-section">
<KonnectorViewerCard
fluidStatus={fluidStatus[fluidType]}
fluidType={fluidType}
isParam={true}
isDisconnected={false}

Guilhem CARRON
committed
setActive={setActive}
active={active}

Guilhem CARRON
committed
key={fluidType}
/>
</div>
)}
</>
) : (
<div className="konnector-section">
<KonnectorViewerCard
fluidStatus={fluidStatus[fluidType]}
fluidType={fluidType}
isParam={false}
isDisconnected={true}
setActive={setActive}
active={active}
/>
) : (
<KonnectorViewerList />
)}
{sgeConnect?.openSGEForm && <SgeConnectView />}
<PartnersIssueModal
open={openPartnersIssueModal}
fluidStatus={fluidStatus}
handleCloseClick={handleCloseModal}
/>
<CustomPopupModal
customPopup={customPopupModal}
handleCloseClick={handleCloseCustomPopupModal}
/>
{Boolean(consentExpiredFluids.length) &&

Guilhem CARRON
committed
consentExpiredFluids.map(fluid => {
return (
<ExpiredConsentModal
key={fluid}
open={openExpiredConsentModal}
handleCloseClick={() => setopenExpiredConsentModal(false)}
fluidType={fluid}
toggleModal={() => setopenExpiredConsentModal(prev => !prev)}

Guilhem CARRON
committed
/>
)
})}
</>
)
}
export default ConsumptionView