import { InboxPanel } from './InboxPanel'; import { CertificateSource, requestPublishForSale, requestWithdrawCertificate, fromGeneralSelectors } from '../../features'; import React, { useState } from 'react'; import { TabContent } from './Inbox/InboxTabContent'; import { SelectedInboxList, IInboxCertificateData } from './Inbox'; import { EnergyFormatter, formatCurrencyComplete, usePermissions } from '../../utils'; import { useDispatch, useSelector } from 'react-redux'; import { useTranslation } from 'react-i18next'; import { makeStyles } from '@material-ui/styles'; import { useOriginConfiguration } from '../../utils/configuration'; import { fromUsersSelectors } from '../../features'; import { Requirements } from '../Layout'; import CurrencyTextField from '@unicef/material-ui-currency-textfield'; import { Unit } from '@energyweb/utils-general'; export function ExchangeInboxPage(): JSX.Element { const dispatch = useDispatch(); const { t } = useTranslation(); const user = useSelector(fromUsersSelectors.getUserOffchain); const [price, setPrice] = useState(0); const currency = useSelector(fromGeneralSelectors.getCurrencies)[0]; const hasBlockchainAccount = !!user.organization?.blockchainAccountAddress; async function publishForSale(certs: IInboxCertificateData[], callback: () => void) { certs.forEach((certificate) => { dispatch( requestPublishForSale({ certificateId: certificate.id, amount: certificate.energy, price: Math.round((price + Number.EPSILON) * 100), callback: () => { callback(); }, source: certificate.source, assetId: certificate.assetId }) ); }); } async function withdraw(certs: IInboxCertificateData[], callback: () => void) { const address = user.organization?.blockchainAccountAddress; certs.forEach((certificate) => { const assetId = certificate.assetId; const amount = certificate.energy.toString(); dispatch( requestWithdrawCertificate({ assetId, address, amount, callback: () => { callback(); } }) ); }); } const configuration = useOriginConfiguration(); const simpleTextColor = configuration?.styleConfig?.SIMPLE_TEXT_COLOR; const useStyles = makeStyles({ text_1: { fontSize: '16px', color: simpleTextColor }, text_2: { fontSize: '14px', color: simpleTextColor, opacity: '.5' } }); const classes = useStyles(); const { canAccessPage } = usePermissions(); if (!canAccessPage.value) { return ; } return ( {({ tabIndex, selectedCerts, getSelectedItems, setEnergy, getSelectedCertificates, updateView, totalVolume }) => { return ( <> {tabIndex === 0 && ( publishForSale(getSelectedCertificates(), updateView) } selectedCerts={selectedCerts} disableButton={price <= 0} > {t('certificate.info.totalVolume')}:{' '} {EnergyFormatter.format(totalVolume, true)} setPrice(value)} minimumValue="0" /> {t('certificate.info.totalPrice')}:{' '} {formatCurrencyComplete( (totalVolume.toNumber() / Unit[EnergyFormatter.displayUnit]) * price, currency )} )} {hasBlockchainAccount && tabIndex === 1 && ( withdraw(getSelectedCertificates(), updateView)} selectedCerts={selectedCerts} > {t('certificate.info.totalVolume')}:{' '} {EnergyFormatter.format(totalVolume, true)} )} > ); }} ); }