import React from 'react' import { Rectangle, Layer } from 'recharts' import { SankeyNodeProps, SankeyTooltipData } from './types' import { DEFAULT_COLORS } from './utils' type PayloadWithColor = { name?: string value?: number color?: string } const SankeyNode: React.FC = ({ x = 0, y = 0, width = 0, height = 0, index = 0, payload, containerWidth = 960, nodeColors = [], onMouseEnter, onMouseLeave, }) => { const isOut = x + width + 150 > containerWidth const maxLabelLength = 25 const truncateLabel = (label: string, maxLength: number) => { if (label.length <= maxLength) return label return label.substring(0, maxLength - 3) + '...' } const nodeName = truncateLabel(payload?.name || '', maxLabelLength) const typedPayload = payload as PayloadWithColor | undefined const nodeColorValue = nodeColors[index] // Extract color string from either string or object format const getColorString = ( value: string | { key: string; color: string } | undefined ): string | undefined => { if (typeof value === 'string') return value if (typeof value === 'object' && value !== null && 'color' in value) { return value.color } return undefined } const defaultColorObj = DEFAULT_COLORS[index % DEFAULT_COLORS.length] const defaultColorString = defaultColorObj.color const nodeColor: string = getColorString(nodeColorValue) || typedPayload?.color || defaultColorString const handleMouseEnter = (e: React.MouseEvent) => { if (onMouseEnter && payload) { const tooltipData: SankeyTooltipData = { payload: { name: payload.name, value: (payload as PayloadWithColor).value, }, } onMouseEnter(tooltipData, e) } } const handleMouseLeave = () => { if (onMouseLeave) { onMouseLeave() } } return ( {nodeName} {payload?.value ? `${payload.value}k` : ''} ) } export default SankeyNode