import { ChainId } from "@certusone/wormhole-sdk"; import { Typography, makeStyles, Grid, useMediaQuery, useTheme, } from "@material-ui/core"; import { useMemo, useState } from "react"; import { ResponsiveContainer, BarChart, XAxis, YAxis, Tooltip, Bar, Legend, } from "recharts"; import { CHAINS_BY_ID, COLOR_BY_CHAIN_ID, getChainShortName, } from "../../../utils/consts"; import { TimeFrame } from "./TimeFrame"; import { formatDate, TransferChartData, formatTVL, renderLegendText } from "./utils"; const useStyles = makeStyles(() => ({ tooltipContainer: { padding: "16px", minWidth: "214px", background: "rgba(255, 255, 255, 0.95)", borderRadius: "4px", }, tooltipTitleText: { color: "#21227E", fontSize: "24px", fontWeight: 500, marginLeft: "8px", }, tooltipRuler: { height: "3px", }, tooltipValueText: { color: "#404040", fontSize: "18px", fontWeight: 500, }, tooltipIcon: { width: "24px", height: "24px", }, })); interface BarData { date: Date; volume: { [chainId: string]: number; }; volumePercent: { [chainId: string]: number; }; } const createBarData = ( transferData: TransferChartData[], selectedChains: ChainId[] ) => { return transferData.reduce((barData, transfer) => { const data: BarData = { date: transfer.date, volume: {}, volumePercent: {}, }; const totalVolume = Object.entries(transfer.transferredByChain).reduce( (totalVolume, [chainId, volume]) => { if (selectedChains.indexOf(+chainId as ChainId) > -1) { data.volume[chainId] = volume; return totalVolume + volume; } return totalVolume; }, 0 ); if (totalVolume > 0) { Object.keys(data.volume).forEach((chainId) => { data.volumePercent[chainId] = (data.volume[chainId] / totalVolume) * 100; }); } barData.push(data); return barData; }, []); }; const CustomTooltip = ({ active, payload, chainId }: any) => { const classes = useStyles(); if (active && payload && payload.length && chainId) { const chainShortName = getChainShortName(chainId); const data = payload.find((data: any) => data.name === chainShortName); if (data) { return (
{chainShortName} {chainShortName}
{`${data.value.toFixed(1)}%`} {formatTVL(data.payload.volume[chainId])} {formatDate(data.payload.date)}
); } } return null; }; const VolumeStackedBarChart = ({ transferData, timeFrame, selectedChains, }: { transferData: TransferChartData[]; timeFrame: TimeFrame; selectedChains: ChainId[]; }) => { const [hoverChainId, setHoverChainId] = useState(null); const barData = useMemo(() => { return createBarData(transferData, selectedChains); }, [transferData, selectedChains]); const theme = useTheme(); const isXSmall = useMediaQuery(theme.breakpoints.down("xs")); return ( `${tick}%`} ticks={[0, 25, 50, 75, 100]} domain={[0, 100]} tick={{ fill: "white" }} axisLine={false} tickLine={false} /> } cursor={{ fill: "transparent" }} /> {selectedChains.map((chainId) => ( setHoverChainId(chainId)} /> ))} ); }; export default VolumeStackedBarChart;