* applied eslint * add locales and lint the project * removed error boundary * updated locales * fix min files * fix locales
87 lines
2.1 KiB
TypeScript
87 lines
2.1 KiB
TypeScript
import React from 'react';
|
|
import { Layer } from 'recharts';
|
|
|
|
interface CustomLinkProps {
|
|
hoveredLinks: string[];
|
|
activeLinks: string[];
|
|
payload: any;
|
|
sourceX: number;
|
|
targetX: number;
|
|
sourceY: number;
|
|
targetY: number;
|
|
sourceControlX: number;
|
|
targetControlX: number;
|
|
linkWidth: number;
|
|
index: number;
|
|
activeLink: any;
|
|
onClick?: (payload: any) => void;
|
|
onMouseEnter?: () => void;
|
|
onMouseLeave?: () => void;
|
|
strokeOpacity?: number;
|
|
}
|
|
|
|
const CustomLink: React.FC<CustomLinkProps> = (props) => {
|
|
const [fill, setFill] = React.useState('url(#linkGradient)');
|
|
const {
|
|
hoveredLinks,
|
|
activeLinks,
|
|
payload,
|
|
sourceX,
|
|
targetX,
|
|
sourceY,
|
|
targetY,
|
|
sourceControlX,
|
|
targetControlX,
|
|
linkWidth,
|
|
index,
|
|
activeLink,
|
|
} = props;
|
|
const isActive = activeLinks?.length > 0 && activeLinks.includes(payload.id);
|
|
const isHover = hoveredLinks?.length > 0 && hoveredLinks.includes(payload.id);
|
|
|
|
const onClick = () => {
|
|
if (props.onClick) {
|
|
props.onClick(props.payload);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<Layer
|
|
key={`CustomLink${index}`}
|
|
onClick={onClick}
|
|
onMouseEnter={props.onMouseEnter}
|
|
onMouseLeave={props.onMouseLeave}
|
|
>
|
|
<path
|
|
d={`
|
|
M${sourceX},${sourceY + linkWidth / 2}
|
|
C${sourceControlX},${sourceY + linkWidth / 2}
|
|
${targetControlX},${targetY + linkWidth / 2}
|
|
${targetX},${targetY + linkWidth / 2}
|
|
L${targetX},${targetY - linkWidth / 2}
|
|
C${targetControlX},${targetY - linkWidth / 2}
|
|
${sourceControlX},${sourceY - linkWidth / 2}
|
|
${sourceX},${sourceY - linkWidth / 2}
|
|
Z
|
|
`}
|
|
fill={
|
|
isActive
|
|
? 'rgba(57, 78, 255, 1)'
|
|
: isHover
|
|
? 'rgba(57, 78, 255, 0.5)'
|
|
: fill
|
|
}
|
|
strokeWidth="1"
|
|
strokeOpacity={props.strokeOpacity}
|
|
onMouseEnter={() => {
|
|
setFill('rgba(57, 78, 255, 0.5)');
|
|
}}
|
|
onMouseLeave={() => {
|
|
setFill('url(#linkGradient)');
|
|
}}
|
|
/>
|
|
</Layer>
|
|
);
|
|
};
|
|
|
|
export default CustomLink;
|