import React, { useState, useEffect } from 'react'; import { useSelector, useDispatch } from 'react-redux'; import { useTranslation } from 'react-i18next'; import { Typography, Paper, makeStyles, Theme, createStyles, Button, Box, IconButton, Avatar, useTheme } from '@material-ui/core'; import { KeyboardArrowUp, KeyboardArrowDown, ArrowForward, ArrowBack, ArrowRightAlt } from '@material-ui/icons'; import { UserStatus } from '@energyweb/origin-backend-core'; import { EnergyFormatter, EnergyTypes, energyImageByType, formatCurrencyComplete, fromGeneralSelectors, fromUsersSelectors } from '@energyweb/origin-ui-core'; import { IOriginTypography } from '../../types/typography'; import { getEnvironment } from '../../features/general'; import { buyBundle } from '../../features/bundles'; import { Bundle, Split } from '../../utils/exchange'; import { bundlePrice } from '../../utils/bundles'; import { deviceById, deviceTypeChecker } from '../../utils/device'; import { useOriginConfiguration } from '../../utils/configuration'; import { AnyDevice } from '../../types'; import moment from 'moment'; interface IOwnProps { bundle: Bundle; owner: boolean; splits: Split[]; devices: AnyDevice[]; } const useStyles = makeStyles((theme: Theme) => createStyles({ root: { paddingLeft: theme.spacing(2), height: '100%' } }) ); const ROWS_COUNT = 5; const COLUMNS_COUNT = 5; const topGridTemplateRows = 'auto'; const topGridTemplateColumns = '40% 60%'; const bundlesGridTemplatesColumns = '20% '.repeat(5); const bundleStyle = { cursor: 'pointer', marginRight: 2, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center' }; const rowStyle = { display: 'grid', gridTemplateColumns: topGridTemplateColumns }; export const BundleContents = (props: IOwnProps) => { const { bundle, splits, devices } = props; const { price, items, id } = bundle; const offerClasses = useStyles(); const [selected, setSelected] = useState(null); const [firstItem, setFirstItem] = useState(0); const [firstSplit, setFirstSplit] = useState(0); const { t } = useTranslation(); const dispatch = useDispatch(); const environment = useSelector(getEnvironment); const currency = useSelector(fromGeneralSelectors.getCurrencies)[0]; const configuration = useOriginConfiguration(); const originSimpleTextColor = configuration?.styleConfig?.SIMPLE_TEXT_COLOR; const fontSize = ((useTheme().typography as unknown) as IOriginTypography)?.fontSizeMd; const onBuyBundle = async () => { dispatch(buyBundle({ bundleDTO: { bundleId: id, volume: selected.volume.toString() } })); }; const action = { onClick: onBuyBundle, label: 'certificate.actions.buy_bundle' }; const fifthFromEnd = (arrayLength: number) => { return arrayLength < 5 ? 0 : arrayLength - 5; }; useEffect(() => { if (firstSplit > fifthFromEnd(splits.length)) { setFirstSplit(fifthFromEnd(splits.length)); } }, [splits]); const status = useSelector(fromUsersSelectors.getUserOffchain)?.status; const userIsActive = status === UserStatus.Active; return ( {splits.length > COLUMNS_COUNT && ( setFirstSplit(firstSplit - 1)} style={{ position: 'absolute', top: '50%', left: '38%', zIndex: 10, color: originSimpleTextColor }} className="ScrollButton" size="small" > )} {splits.length > COLUMNS_COUNT && ( = fifthFromEnd(splits.length)} onClick={() => setFirstSplit(firstSplit + 1)} style={{ position: 'absolute', top: '50%', left: '98%', zIndex: 10, color: originSimpleTextColor }} className="ScrollButton" size="small" > )} {items.length > ROWS_COUNT && ( )} {splits.slice(firstSplit, firstSplit + COLUMNS_COUNT).map((split) => { const { volume } = split; return ( setSelected(split)} style={{ ...bundleStyle, borderRadius: '5% 5% 0 0', flexDirection: 'column' }} > {t('bundle.properties.totalVolume')} {EnergyFormatter.format(split.volume, true)} ); })} {items .slice(firstItem, firstItem + ROWS_COUNT) .map( ( { id: itemId, asset: { deviceId, generationFrom, generationTo } }, itemIndex, { length } ) => { const device = deviceById(deviceId, devices, environment); return ( {t('device.properties.facility')} {device && ( {deviceTypeChecker(device) ? device.facilityName : device.name} )} {t('device.properties.location')} {device && ( {deviceTypeChecker(device) ? device.province : device.address} )} {t('certificate.properties.generationDate')} {moment(generationFrom).format('MMM, YYYY')} {moment(generationTo).format('MMM, YYYY')} {splits .slice(firstSplit, firstSplit + COLUMNS_COUNT) .map((split) => { const { volume } = split.items.find( ({ id: splitItemId }) => splitItemId === itemId ); const type = device ? (device.deviceType .split(';')[0] .toLowerCase() as EnergyTypes) : EnergyTypes.SOLAR; return ( setSelected(split)} className={ selected === split ? 'SelectedCardContent' : 'CardContent' } > {EnergyFormatter.format(volume, true)} ); })} ); } )} {items.length > ROWS_COUNT && ( )} {splits.slice(firstSplit, firstSplit + COLUMNS_COUNT).map((split) => { const { volume } = split; const splitPrice = bundlePrice({ volume, price }); return ( setSelected(split)} className={ selected === split ? 'SelectedCardContent' : 'CardContent' } mr={1} pb={1} > {t('certificate.properties.totalPrice')} {formatCurrencyComplete(splitPrice, currency)} {!bundle.own && userIsActive && ( )} ); })} ); };