Newer
Older
import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation'
import FormProgress from 'components/CommonKit/FormProgress/FormProgress'
import Content from 'components/Content/Content'
import CozyBar from 'components/Header/CozyBar'
import Header from 'components/Header/Header'
import useKonnectorAuth from 'components/Hooks/useKonnectorAuth'
import useUserInstanceSettings from 'components/Hooks/useUserInstanceSettings'
import { useClient } from 'cozy-client'
import { FORM_DOCTYPE } from 'doctypes'
import { FluidType } from 'enums'
import { AccountGRDFData } from 'models'
import React, { useCallback, useEffect, useRef, useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { useAppSelector } from 'store/hooks'
import '../connection.scss'
import { createInitialGrdfState, useFormData } from '../useForm'
import StepConsent from './StepConsent'
import { StepIdentity } from './StepIdentity'
export enum GrdfStep {
Identity,
Consent,
}
/**
* http://ecolyo.cozy.tools:8080/#/connect/gas
*/
const { instanceSettings } = useUserInstanceSettings()
const { fluidStatus } = useAppSelector(state => state.ecolyo.global)
const currentFluidStatus = fluidStatus[FluidType.GAS]
const account = currentFluidStatus.connection.account
const [launchConnection, setLaunchConnection] = useState(false)
const [currentStep, setCurrentStep] = useState<GrdfStep>(GrdfStep.Identity)
const [grdfState, setGrdfState] = useState<AccountGRDFData>(
createInitialGrdfState()
)
const [formConsent, setFormConsent] = useState({
dataConsent: false,
pceConfirm: false,
const mainContentRef = useRef<HTMLDivElement>(null)
const focusMainContent = () => {
setTimeout(() => mainContentRef.current?.focus(), 0)
}
const [connect, update] = useKonnectorAuth(FluidType.GAS, {
setGrdfState(prev => ({
...prev,
...createInitialGrdfState(formData),
}))
}, [formData])
useEffect(() => {
setGrdfState(prev => ({
...prev,
email: instanceSettings.email ?? prev.email,
}))
}, [instanceSettings])
useEffect(() => {
async function launchConnect() {
if (launchConnection) {
if (!account) {
await connect()
} else {
await update()
}
navigate('/consumption/gas')
}
}
launchConnect()
}, [account, connect, launchConnection, navigate, update])
const isNextValid = useCallback(() => {
if (currentStep === GrdfStep.Identity) {
return (
grdfState.firstname !== '' &&
grdfState.lastname !== '' &&
grdfState.postalCode !== '' &&
grdfState.email.includes('@') &&
grdfState.pce.length === 14
)
} else if (currentStep === GrdfStep.Consent) {
return formConsent.dataConsent && formConsent.pceConfirm
}
return false
}, [
currentStep,
formConsent.dataConsent,
formConsent.pceConfirm,
grdfState.email,
grdfState.firstname,
grdfState.lastname,
grdfState.pce,
grdfState.postalCode,
])
const handleNext = useCallback(() => {
if (!isNextValid()) return
if (currentStep < GrdfStep.Consent) {
setCurrentStep(prev => prev + 1)
client.save({
...formData,
_type: FORM_DOCTYPE,
firstName: grdfState.firstname,
lastName: grdfState.lastname,
pce: grdfState.pce,
zipCode: grdfState.postalCode,
})
}
if (currentStep === GrdfStep.Consent) {
setLaunchConnection(true)
}
focusMainContent()
}, [
client,
currentStep,
formData,
grdfState.firstname,
grdfState.lastname,
grdfState.pce,
grdfState.postalCode,
isNextValid,
])
const handlePrev = () => {
setCurrentStep(prev => prev - 1)
focusMainContent()
}
const renderStep = (step: GrdfStep) => {
if (step === GrdfStep.Identity) {
return <StepIdentity formData={grdfState} setFormData={setGrdfState} />
} else {
return (
<StepConsent
formConsent={formConsent}
setFormConsent={setFormConsent}
/>
)
}
}
return (
<>
<CozyBar titleKey="common.title_gas_connect" displayBackArrow={true} />
<Header
desktopTitleKey="common.title_gas_connect"
displayBackArrow={true}
/>
<div ref={mainContentRef} className="connectView" tabIndex={-1}>
<div className="stepContainer">
<FormProgress
currentStep={currentStep}
totalSteps={Object.keys(GrdfStep).length / 2}
/>
{renderStep(currentStep)}
</div>
<FormNavigation
handlePrevious={handlePrev}
handleNext={handleNext}
isLoading={false}
disableNextButton={!isNextValid()}
disablePrevButton={currentStep === GrdfStep.Identity}
isLastStep={currentStep === GrdfStep.Consent}
/>
</div>
</Content>
</>
)
}