import { Button, Dialog, DialogActions, DialogContent, DialogTitle, TextField } from '@material-ui/core'; import { BigNumber } from 'ethers'; import moment from 'moment'; import React, { useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { resyncCertificate, requestDepositCertificate } from '../../features/certificates'; import { ICertificateViewItem } from '../../features/certificates/types'; import { EnergyFormatter, formatDate, countDecimals } from '../../utils'; import { fromGeneralSelectors, IEnvironment } from '../../features/general'; import { IOriginDevice } from '../../types'; import { fromUsersSelectors } from '../../features'; interface IProps { certificate: ICertificateViewItem; device: IOriginDevice; showModal: boolean; callback: () => void; } export function DepositModal(props: IProps) { const { certificate, callback, device, showModal } = props; const user = useSelector(fromUsersSelectors.getUserOffchain); const environment: IEnvironment = useSelector(fromGeneralSelectors.getEnvironment); const DEFAULT_ENERGY_IN_BASE_UNIT = BigNumber.from( Number(environment?.DEFAULT_ENERGY_IN_BASE_UNIT || 1) ); const [energyInDisplayUnit, setEnergyInDisplayUnit] = useState( EnergyFormatter.getValueInDisplayUnit(DEFAULT_ENERGY_IN_BASE_UNIT) ); const [validation, setValidation] = useState({ energyInDisplayUnit: true }); const dispatch = useDispatch(); useEffect(() => { if (certificate) { setEnergyInDisplayUnit( EnergyFormatter.getValueInDisplayUnit(certificate.energy.publicVolume) ); } }, [certificate, user]); async function handleClose() { dispatch(resyncCertificate(certificate)); callback(); } async function validateInputs(event) { switch (event.target.id) { case 'energyInDisplayUnitInput': const newEnergyInDisplayUnit = Number(event.target.value); const newEnergyInBaseValueUnit = EnergyFormatter.getBaseValueFromValueInDisplayUnit( newEnergyInDisplayUnit ); const ownedPublicVolume = certificate.energy.publicVolume; const energyInDisplayUnitValid = newEnergyInBaseValueUnit.gte(1) && newEnergyInBaseValueUnit.lt(ownedPublicVolume) && countDecimals(newEnergyInDisplayUnit) === 0; setEnergyInDisplayUnit(newEnergyInDisplayUnit); setValidation({ ...validation, energyInDisplayUnit: energyInDisplayUnitValid }); break; } } const isFormValid = validation.energyInDisplayUnit; async function deposit() { if (!isFormValid) { return; } const amount = EnergyFormatter.getBaseValueFromValueInDisplayUnit(energyInDisplayUnit); dispatch( requestDepositCertificate({ certificateId: certificate.id, amount, callback }) ); } const certificateId = certificate ? certificate.id : ''; const facilityName = device ? device.facilityName : ''; let creationTime: string; try { creationTime = certificate && formatDate(moment.unix(certificate.creationTime), true); } catch (error) { console.error('Error: Can not get creation time', error); } return ( {`Deposit #${certificateId}`} {creationTime && ( <> )} validateInputs(e)} placeholder="1" fullWidth />
{!validation.energyInDisplayUnit && (
{EnergyFormatter.displayUnit} value is invalid
)}
); }