/
ChordArcs.tsx
99 lines (94 loc) · 3.26 KB
/
ChordArcs.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import { memo } from 'react'
import { useTransition } from '@react-spring/web'
import { useMotionConfig, useTheme } from '@nivo/core'
import { useInheritedColor } from '@nivo/colors'
import { ChordArc } from './ChordArc'
import { ArcDatum, ArcGenerator, ChordCommonProps, ArcAnimatedProps } from './types'
interface ChordArcsProps {
arcs: ArcDatum[]
arcGenerator: ArcGenerator
borderWidth: ChordCommonProps['arcBorderWidth']
borderColor: ChordCommonProps['arcBorderColor']
getOpacity: (arc: ArcDatum) => number
setCurrent: (arc: ArcDatum | null) => void
isInteractive: ChordCommonProps['isInteractive']
onMouseEnter?: ChordCommonProps['onArcMouseEnter']
onMouseMove?: ChordCommonProps['onArcMouseMove']
onMouseLeave?: ChordCommonProps['onArcMouseLeave']
onClick?: ChordCommonProps['onArcClick']
tooltip: ChordCommonProps['arcTooltip']
}
export const ChordArcs = memo(
({
arcs,
borderWidth,
borderColor,
getOpacity,
arcGenerator,
setCurrent,
isInteractive,
onMouseEnter,
onMouseMove,
onMouseLeave,
onClick,
tooltip,
}: ChordArcsProps) => {
const { animate, config: springConfig } = useMotionConfig()
const theme = useTheme()
const getBorderColor = useInheritedColor(borderColor, theme)
const transition = useTransition<ArcDatum, ArcAnimatedProps>(arcs, {
keys: arc => arc.id,
initial: arc => ({
startAngle: arc.startAngle,
endAngle: arc.endAngle,
color: arc.color,
opacity: getOpacity(arc),
borderColor: getBorderColor(arc),
}),
from: arc => ({
startAngle: arc.startAngle,
endAngle: arc.endAngle,
color: arc.color,
opacity: 0,
borderColor: getBorderColor(arc),
}),
update: arc => ({
startAngle: arc.startAngle,
endAngle: arc.endAngle,
color: arc.color,
opacity: getOpacity(arc),
borderColor: getBorderColor(arc),
}),
leave: arc => ({
startAngle: arc.startAngle,
endAngle: arc.endAngle,
color: arc.color,
opacity: 0,
borderColor: getBorderColor(arc),
}),
expires: true,
config: springConfig,
immediate: !animate,
})
return (
<>
{transition((animatedProps, arc) => (
<ChordArc
key={arc.id}
arc={arc}
arcGenerator={arcGenerator}
animatedProps={animatedProps}
borderWidth={borderWidth}
setCurrent={setCurrent}
isInteractive={isInteractive}
tooltip={tooltip}
onMouseEnter={onMouseEnter}
onMouseMove={onMouseMove}
onMouseLeave={onMouseLeave}
onClick={onClick}
/>
))}
</>
)
}
)