import React, { useState, useEffect, ReactElement } from 'react'; import { useSelector } from 'react-redux'; import { useTranslation } from 'react-i18next'; import { TableCell, Button, InputAdornment, Grid, Typography } from '@material-ui/core'; import { IDevice, UserStatus } from '@energyweb/origin-backend-core'; import { Formik, Form } from 'formik'; import { formatDate, useValidation, EnergyFormatter, LightenColor, fromGeneralSelectors, fromUsersSelectors } from '@energyweb/origin-ui-core'; import { IAsset, IOrderBookOrderDTO, calculateTotalPrice } from '../../utils/exchange'; import { useOriginConfiguration } from '../../utils/configuration'; import { FormInput } from '../Form'; import { Orders, IOrdersProps } from './Orders'; import moment from 'moment'; interface IAsksProps { buyDirect: (orderId: string, volume: string, price: number) => void; energyUnit: string; displayAssetDetails?: boolean; directBuydisabled?: boolean; } type Props = IAsksProps & IOrdersProps; export const Asks = (props: Props): ReactElement => { const { buyDirect, displayAssetDetails, energyUnit, currency, ordersTotalVolume, directBuydisabled = false } = props; const exchangeClient = useSelector(fromGeneralSelectors.getExchangeClient); const backendClient = useSelector(fromGeneralSelectors.getBackendClient); const environment = useSelector(fromGeneralSelectors.getEnvironment); const user = useSelector(fromUsersSelectors.getUserOffchain); const { t } = useTranslation(); const { Yup } = useValidation(); const popoverText = [ t('exchange.popover.asksDescription'), t('exchange.popover.asksFurtherInstructions') ]; const [selectedOrder, setSelectedOrder] = useState(null); const [asset, setAsset] = useState(); const [device, setDevice] = useState(); const [buyDirectExpanded, setBuyDirectExpanded] = useState(false); async function fetchDetails(assetId: string) { if (!assetId) { setAsset(null); setDevice(null); return; } const { data: newAsset } = await exchangeClient.assetClient.get(selectedOrder.assetId); const { data: newDevice } = await backendClient.deviceClient.getByExternalId( environment.ISSUER_ID, newAsset.deviceId ); setAsset(newAsset); setDevice(newDevice); } useEffect(() => { fetchDetails(selectedOrder?.assetId); return () => { setAsset(null); setDevice(null); }; }, [selectedOrder]); const VALIDATION_SCHEMA = Yup.object().shape({ energy: Yup.number() .positive() .integer() .max(selectedOrder ? EnergyFormatter.getValueInDisplayUnit(selectedOrder.volume) : 0) .label(t('exchange.properties.energy')) }); const initialFormValues = { energy: '' }; const originBgColor = useOriginConfiguration()?.styleConfig.MAIN_BACKGROUND_COLOR; const customRowBgColor = LightenColor(originBgColor, -3); return ( { if (selectedOrder?.id === newOrder?.id) { setSelectedOrder(null); } else { setSelectedOrder(newOrder); } }} customRow={ selectedOrder && displayAssetDetails && device ? { shouldDisplay: (row: { id: string }) => row?.id === selectedOrder?.id, display: ( {t('device.properties.facilityName')} {device?.facilityName} {t('device.properties.constructed')} {device?.operationalSince && moment.unix(device.operationalSince).year()} {t('device.properties.deviceType')} {device?.deviceType?.split(';').join(' - ')} {t('exchange.properties.generationStart')} {formatDate( asset.generationFrom, false, device.timezone )} {t('exchange.properties.generationEnd')} {formatDate( asset.generationTo, false, device.timezone )} {selectedOrder?.userId !== user?.id?.toString() && ( {(formikProps) => { const { isValid, values, resetForm, dirty } = formikProps; return (
{buyDirectExpanded && ( {energyUnit} ) }} /> )} {user?.status === UserStatus.Active && ( )} {buyDirectExpanded && isValid && ( {t('exchange.feedback.total')}:{' '} {calculateTotalPrice( ( selectedOrder.price / 100 ).toString(), values.energy )}{' '} {currency} )}
); }}
)}
) } : null } {...props} /> ); };