import React, { useState } from 'react'; import { useSelector, useDispatch } from 'react-redux'; import { useTranslation } from 'react-i18next'; import { Formik, FormikHelpers, Form } from 'formik'; import * as Yup from 'yup'; import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Box, Grid, Typography, Switch, InputAdornment, Divider } from '@material-ui/core'; import { Close } from '@material-ui/icons'; import { EnergyFormatter, fromGeneralSelectors, LightenColor, moment } from '@energyweb/origin-ui-core'; import { DemandStatus, TimeFrame } from '@energyweb/utils-general'; import { updateDemand, pauseDemand, resumeDemand } from '../../features'; import { Demand, IProductDTO, Order, periodTypeOptions } from '../../utils'; import { CalendarFieldOnPeriod, FormInput, FormSelect } from '../Form'; import { TotalDemandVolume } from '../orders'; import { useOriginConfiguration } from '../../utils/configuration'; interface IFormValues { userId: string; id: string; periodTimeFrame: TimeFrame; start: Date; end: Date; volumePerPeriod: string; price: string; product: IProductDTO; bids: Order[]; status: DemandStatus; } const INITIAL_FORM_VALUES: IFormValues = { userId: '', id: '', periodTimeFrame: TimeFrame.Daily, start: null, end: null, volumePerPeriod: '', price: '', product: {}, bids: [], status: null }; interface IProps { demand: Demand; close: () => void; } export function DemandUpdateModal(props: IProps) { const { demand, close } = props; const initialStatus = demand.status === DemandStatus.ACTIVE; const [demandStatus, setDemandStatus] = useState(initialStatus); const { t } = useTranslation(); const dispatch = useDispatch(); const currencies = useSelector(fromGeneralSelectors.getCurrencies); const defaultCurrency = (currencies && currencies[0]) ?? 'USD'; const periodOptions = periodTypeOptions(t, false); const configuration = useOriginConfiguration(); const originBgColor = configuration?.styleConfig?.MAIN_BACKGROUND_COLOR; const bgLighten = LightenColor(originBgColor, 5); async function updateStatus(id, status) { const newStatus = !status; setDemandStatus(newStatus); if (status) { dispatch(pauseDemand(id)); close(); } else { dispatch(resumeDemand(id)); close(); } } async function submitForm( values: typeof INITIAL_FORM_VALUES, formikActions: FormikHelpers ): Promise { formikActions.setSubmitting(true); dispatch( updateDemand(values.id, { price: parseFloat(values.price) * 100, volumePerPeriod: EnergyFormatter.getBaseValueFromValueInDisplayUnit( parseFloat(values.volumePerPeriod) ).toString(), periodTimeFrame: values.periodTimeFrame, start: moment(values.start).toISOString(), end: moment(values.end).toISOString(), product: values.product, boundToGenerationTime: false }) ); formikActions.setSubmitting(false); close(); } const VALIDATION_SCHEMA = Yup.object().shape({ periodTimeFrame: Yup.string().label(t('demand.properties.period')), volumePerPeriod: Yup.number() .required() .positive() .integer() .transform((_value, originalValue) => Number(originalValue.replace(/,/, '.'))) .label(t('demand.properties.volume')), start: Yup.date().label(t('demand.properties.start')), end: Yup.date().label(t('demand.properties.end')), price: Yup.number().required().positive().min(0.01).label(t('demand.properties.price')) }); const initialFormValues: IFormValues = { ...demand, volumePerPeriod: EnergyFormatter.format(Number(demand?.volumePerPeriod)), price: (parseFloat(demand?.price) / 100).toFixed(2) }; return ( {(formikProps) => { const { isValid, isSubmitting, dirty, values } = formikProps; const buttonDisabled = !dirty || isSubmitting || !isValid; return (
{t('demand.captions.updateDemand')} {t('demand.captions.activateDemand')} updateStatus(values.id, demandStatus) } /> {EnergyFormatter.displayUnit} ) }} /> {defaultCurrency} ) }} wrapperProps={{ onBlur: (e) => { const parsedValue = parseFloat( (e.target as any)?.value ); if ( !isNaN(parsedValue) && parsedValue > 0 ) { values.price = parsedValue.toFixed(2); } } }} />
); }}
); }