Skip to content
Snippets Groups Projects
FluidButton.tsx 3.14 KiB
Newer Older
  • Learn to ignore specific revisions
  • import ErrorNotif from 'assets/icons/ico/notif_error.svg'
    import PartnerIssueNotif from 'assets/icons/ico/notif_maintenance.svg'
    import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
    import { useClient } from 'cozy-client'
    
    Bastien DUMONT's avatar
    Bastien DUMONT committed
    import { useI18n } from 'cozy-ui/transpiled/react/I18n'
    
    import { FluidState, FluidType, UsageEventType } from 'enums'
    
    Bastien DUMONT's avatar
    Bastien DUMONT committed
    import React, { useCallback, useEffect, useState } from 'react'
    
    import { useNavigate } from 'react-router-dom'
    
    import UsageEventService from 'services/usageEvent.service'
    
    import { useAppSelector } from 'store/hooks'
    
    import { getNavPicto } from 'utils/picto'
    
    import { getFluidName, isKonnectorActive } from 'utils/utils'
    
    
    interface FluidButtonProps {
      fluidType: FluidType
      isActive: boolean
    }
    
    
    const FluidButton = ({ fluidType, isActive }: FluidButtonProps) => {
    
      const { t } = useI18n()
      const client = useClient()
    
      const navigate = useNavigate()
      const { fluidStatus } = useAppSelector(state => state.ecolyo.global)
    
      const [showError, setShowError] = useState<boolean>(false)
    
    
      const isConnected = useCallback(() => {
        if (fluidType === FluidType.MULTIFLUID) {
          return true
        } else return isKonnectorActive(fluidStatus, fluidType)
      }, [fluidStatus, fluidType])
    
    
          (fluidType !== FluidType.MULTIFLUID &&
            fluidStatus[fluidType].status === FluidState.ERROR) ||
          (fluidType !== FluidType.WATER &&
            fluidStatus[fluidType].status === FluidState.ERROR_LOGIN_FAILED)
    
      const iconType = getNavPicto(fluidType, isActive, isConnected())
    
      const goToFluid = useCallback(async () => {
        await UsageEventService.addEvent(client, {
          type: UsageEventType.NAVIGATION_EVENT,
    
          target: getFluidName(fluidType),
    
          fluidType === FluidType.MULTIFLUID
            ? '/consumption'
    
            : `/consumption/${getFluidName(fluidType)}`
    
      }, [navigate, fluidType, client])
    
      const isFluidMaintenance = () => fluidStatus[fluidType]?.maintenance
    
        // Show errors only on connected konnectors that are in error, outdated, with no data (specific case), and not in multifluid
    
        if (fluidType !== FluidType.MULTIFLUID && isConnected() && isErrored()) {
    
      }, [fluidStatus, fluidType, isConnected, isErrored])
    
      return (
        <div
          className={`fluid-title ${FluidType[
            fluidType
          ].toLowerCase()} fluid-button`}
          onClick={goToFluid}
        >
          <StyledIcon
            className="fluid-icon"
            icon={iconType}
            size={fluidType === FluidType.MULTIFLUID ? 36 : 32}
          />
    
          {isFluidMaintenance() ? (
    
            <StyledIcon
              icon={PartnerIssueNotif}
              size={22}
              className="notif-error"
            />
          ) : (
            showError && (
              <StyledIcon icon={ErrorNotif} size={22} className="notif-error" />
            )
    
            className={`fluid-title ${getFluidName(fluidType)} ${
    
              isActive && 'active'
            } text-14-normal`}
    
            {t(`FLUID.${FluidType[fluidType]}.LABEL`)}
    
          </div>
        </div>
      )
    }
    
    export default FluidButton