import React, { useState } from 'react' import { Layer } from 'recharts' import { SankeyLinkProps, SankeyTooltipData } from './types' type PayloadWithColor = { source?: number | string target?: number | string value?: number color?: string hoverColor?: string sourceName?: string targetName?: string } const SankeyLink: React.FC = ({ sourceX = 0, targetX = 0, sourceY = 0, targetY = 0, sourceControlX = 0, targetControlX = 0, linkWidth = 0, index = 0, payload, linkColors = [], onMouseEnter, onMouseLeave, }) => { const typedPayload = payload as PayloadWithColor | undefined const linkColorValue = linkColors[index || 0] const linkColorString = typeof linkColorValue === 'string' ? linkColorValue : typeof linkColorValue === 'object' && linkColorValue?.color ? linkColorValue.color : undefined const defaultFill = linkColorString || typedPayload?.color || 'url(#linkGradient)' const [fill, setFill] = useState(defaultFill) const handleMouseEnter = (e: React.MouseEvent) => { if (typedPayload?.hoverColor) { setFill(typedPayload.hoverColor) } if (onMouseEnter && payload) { const tooltipData: SankeyTooltipData = { payload: { source: typedPayload?.source, target: typedPayload?.target, value: typedPayload?.value, sourceName: typedPayload?.sourceName, targetName: typedPayload?.targetName, color: typedPayload?.color, }, } onMouseEnter(tooltipData, e) } } const handleMouseLeave = () => { setFill(defaultFill) if (onMouseLeave) { onMouseLeave() } } return ( ) } SankeyLink.displayName = 'SankeyLink' export default SankeyLink