import {
BarChart,
Bar,
XAxis,
YAxis,
CartesianGrid,
Tooltip,
Legend,
TooltipContentProps,
TooltipIndex,
useRechartsTheme,
} from 'recharts';
// #region Sample data
const data = [
{
name: 'Page A',
uv: 4000,
pv: 2400,
amt: 2400,
},
{
name: 'Page B',
uv: 3000,
pv: 1398,
amt: 2210,
},
{
name: 'Page C',
uv: 2000,
pv: 9800,
amt: 2290,
},
{
name: 'Page D',
uv: 2780,
pv: 3908,
amt: 2000,
},
{
name: 'Page E',
uv: 1890,
pv: 4800,
amt: 2181,
},
{
name: 'Page F',
uv: 2390,
pv: 3800,
amt: 2500,
},
{
name: 'Page G',
uv: 3490,
pv: 4300,
amt: 2100,
},
];
// #endregion
const getIntroOfPage = (label: string | number | undefined) => {
if (label === 'Page A') {
return "Page A is about men's clothing";
}
if (label === 'Page B') {
return "Page B is about women's dress";
}
if (label === 'Page C') {
return "Page C is about women's bag";
}
if (label === 'Page D') {
return 'Page D is about household goods';
}
if (label === 'Page E') {
return 'Page E is about food';
}
if (label === 'Page F') {
return 'Page F is about baby food';
}
return '';
};
const CustomTooltip = ({ active, payload, label }: TooltipContentProps) => {
const theme = useRechartsTheme();
const firstPayload = payload?.[0];
const isVisible = active && firstPayload != null;
return (
<div
className="custom-tooltip"
style={{
...theme?.typography,
...theme?.tooltip?.contentStyle,
visibility: isVisible ? 'visible' : 'hidden',
}}
>
{isVisible && (
<>
<p className="label">{`${label} : ${firstPayload.value}`}</p>
<p className="intro">{getIntroOfPage(label)}</p>
<p className="desc">Anything you want can be displayed here.</p>
</>
)}
</div>
);
};
const CustomContentOfTooltip = ({
isAnimationActive,
defaultIndex,
}: {
isAnimationActive?: boolean;
defaultIndex?: TooltipIndex;
}) => {
return (
<BarChart
style={{ width: '100%', maxWidth: '300px', maxHeight: '70vh', aspectRatio: 1.618 }}
responsive
data={data}
margin={{
top: 5,
right: 0,
left: 0,
bottom: 0,
}}
>
<CartesianGrid />
<XAxis dataKey="name" niceTicks="snap125" />
<YAxis width="auto" niceTicks="snap125" />
<Tooltip content={CustomTooltip} isAnimationActive={isAnimationActive} defaultIndex={defaultIndex} />
<Legend />
<Bar dataKey="pv" barSize={20} isAnimationActive={isAnimationActive} />
</BarChart>
);
};
export default CustomContentOfTooltip;