-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathLinePath.tsx
81 lines (77 loc) · 1.75 KB
/
LinePath.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import React, {
FC,
SVGAttributes,
useEffect,
useMemo,
useRef,
useState,
} from 'react';
import { LineData, LineCurve } from 'eazychart-core/src/types';
import { defaultColor, generateLinePath } from 'eazychart-core/src';
import { useChart } from '@/lib/use-chart';
export interface LinePathProps extends SVGAttributes<SVGPathElement> {
shapeData?: LineData;
curve?: LineCurve;
beta?: number;
}
export const LinePath: FC<LinePathProps> = ({
shapeData = [],
curve = 'curveLinear',
beta,
stroke = defaultColor,
strokeWidth = 1,
fill = 'none',
strokeLinejoin = 'round',
strokeLinecap = 'round',
children,
...rest
}) => {
const {
animationOptions: { duration },
} = useChart();
const dataPath = useMemo(
() => generateLinePath(shapeData, curve, beta),
[shapeData, curve, beta]
);
const [pathLength, setPathLength] = useState(0);
const ref = useRef<SVGPathElement | null>(null);
useEffect(() => {
if (ref.current) {
setPathLength(ref.current.getTotalLength());
}
}, [dataPath]);
return (
<path
ref={ref}
d={dataPath}
stroke={stroke}
strokeWidth={strokeWidth}
fill={fill}
strokeLinejoin={strokeLinejoin}
strokeLinecap={strokeLinecap}
{...rest}
className="ez-line"
>
{children ? (
children
) : (
<>
<animate
attributeName="stroke-dasharray"
attributeType="CSS"
from={pathLength}
to={pathLength}
dur={'0s'}
/>
<animate
attributeName="stroke-dashoffset"
attributeType="CSS"
from={pathLength}
to={0}
dur={`${duration}ms`}
/>
</>
)}
</path>
);
};