Skip to content

Commit 5ec257f

Browse files
committedSep 11, 2021
feat(radial-bar): use the @nivo/arcs package
1 parent d8fd769 commit 5ec257f

File tree

9 files changed

+100
-194
lines changed

9 files changed

+100
-194
lines changed
 

‎packages/radial-bar/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"!dist/tsconfig.tsbuildinfo"
3030
],
3131
"dependencies": {
32+
"@nivo/arcs": "0.73.0",
3233
"@nivo/colors": "0.73.0",
3334
"@nivo/legends": "0.73.0",
3435
"@nivo/tooltip": "0.73.0",

‎packages/radial-bar/src/RadialBar.tsx

+14-12
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const InnerRadialBar = ({
2727
onMouseEnter,
2828
onMouseMove,
2929
onMouseLeave,
30+
transitionMode = svgDefaultProps.transitionMode,
3031
role,
3132
ariaLabel,
3233
ariaLabelledBy,
@@ -67,18 +68,19 @@ const InnerRadialBar = ({
6768

6869
if (layers.includes('bars')) {
6970
layerById.bars = (
70-
<g key="bars" transform={`translate(${center[0]}, ${center[1]})`}>
71-
<RadialBarArcs
72-
bars={bars}
73-
arcGenerator={arcGenerator}
74-
isInteractive={isInteractive}
75-
tooltip={tooltip}
76-
onClick={onClick}
77-
onMouseEnter={onMouseEnter}
78-
onMouseMove={onMouseMove}
79-
onMouseLeave={onMouseLeave}
80-
/>
81-
</g>
71+
<RadialBarArcs
72+
key="bars"
73+
center={center}
74+
bars={bars}
75+
arcGenerator={arcGenerator}
76+
isInteractive={isInteractive}
77+
tooltip={tooltip}
78+
onClick={onClick}
79+
onMouseEnter={onMouseEnter}
80+
onMouseMove={onMouseMove}
81+
onMouseLeave={onMouseLeave}
82+
transitionMode={transitionMode}
83+
/>
8284
)
8385
}
8486

‎packages/radial-bar/src/RadialBarArc.tsx

-95
This file was deleted.
+52-67
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
1-
import { useTransition } from '@react-spring/web'
2-
import { useMotionConfig } from '@nivo/core'
3-
import { ComputedBar, RadialBarArcGenerator, RadialBarCommonProps } from './types'
4-
import { RadialBarArc } from './RadialBarArc'
1+
import { createElement, MouseEvent, useCallback } from 'react'
2+
import { ArcsLayer, ArcGenerator } from '@nivo/arcs'
3+
import { useTooltip } from '@nivo/tooltip'
4+
import { ComputedBar, RadialBarCommonProps } from './types'
55

66
interface RadialBarArcsProps {
7+
center: [number, number]
78
bars: ComputedBar[]
8-
arcGenerator: RadialBarArcGenerator
9+
arcGenerator: ArcGenerator
910
isInteractive: RadialBarCommonProps['isInteractive']
1011
tooltip: RadialBarCommonProps['tooltip']
1112
onClick?: RadialBarCommonProps['onClick']
1213
onMouseEnter?: RadialBarCommonProps['onMouseEnter']
1314
onMouseMove?: RadialBarCommonProps['onMouseMove']
1415
onMouseLeave?: RadialBarCommonProps['onMouseLeave']
16+
transitionMode: RadialBarCommonProps['transitionMode']
1517
}
1618

1719
export const RadialBarArcs = ({
20+
center,
1821
bars,
1922
arcGenerator,
2023
isInteractive,
@@ -23,71 +26,53 @@ export const RadialBarArcs = ({
2326
onMouseEnter,
2427
onMouseMove,
2528
onMouseLeave,
29+
transitionMode,
2630
}: RadialBarArcsProps) => {
27-
const { animate, config: springConfig } = useMotionConfig()
31+
const { showTooltipFromEvent, hideTooltip } = useTooltip()
2832

29-
const transition = useTransition<
30-
ComputedBar,
31-
{
32-
startAngle: number
33-
endAngle: number
34-
innerRadius: number
35-
outerRadius: number
36-
color: string
37-
}
38-
>(bars, {
39-
keys: bar => bar.id,
40-
initial: bar => ({
41-
startAngle: bar.startAngle,
42-
endAngle: bar.endAngle,
43-
innerRadius: bar.innerRadius,
44-
outerRadius: bar.outerRadius,
45-
color: bar.color,
46-
}),
47-
from: bar => ({
48-
startAngle: bar.startAngle,
49-
endAngle: bar.endAngle,
50-
innerRadius: bar.innerRadius,
51-
outerRadius: bar.outerRadius,
52-
color: bar.color,
53-
}),
54-
update: bar => ({
55-
startAngle: bar.startAngle,
56-
endAngle: bar.endAngle,
57-
innerRadius: bar.innerRadius,
58-
outerRadius: bar.outerRadius,
59-
color: bar.color,
60-
}),
61-
leave: bar => ({
62-
startAngle: bar.startAngle + (bar.endAngle - bar.startAngle) / 2,
63-
endAngle: bar.startAngle + (bar.endAngle - bar.startAngle) / 2,
64-
innerRadius: bar.innerRadius,
65-
outerRadius: bar.outerRadius,
66-
color: bar.color,
67-
}),
68-
expires: true,
69-
config: springConfig,
70-
immediate: !animate,
71-
})
33+
const handleClick = useCallback(
34+
(bar: ComputedBar, event: MouseEvent) => {
35+
onClick?.(bar, event)
36+
},
37+
[onClick]
38+
)
39+
40+
const handleMouseEnter = useCallback(
41+
(bar: ComputedBar, event: MouseEvent) => {
42+
showTooltipFromEvent(createElement(tooltip, { bar }), event)
43+
onMouseEnter?.(bar, event)
44+
},
45+
[showTooltipFromEvent, tooltip, onMouseEnter]
46+
)
47+
48+
const handleMouseMove = useCallback(
49+
(bar: ComputedBar, event: MouseEvent) => {
50+
showTooltipFromEvent(createElement(tooltip, { bar }), event)
51+
onMouseMove?.(bar, event)
52+
},
53+
[showTooltipFromEvent, tooltip, onMouseMove]
54+
)
55+
56+
const handleMouseLeave = useCallback(
57+
(bar: ComputedBar, event: MouseEvent) => {
58+
hideTooltip()
59+
onMouseLeave?.(bar, event)
60+
},
61+
[hideTooltip, onMouseLeave]
62+
)
7263

7364
return (
74-
<>
75-
{transition((style, bar) => {
76-
return (
77-
<RadialBarArc
78-
key={bar.id}
79-
bar={bar}
80-
animated={style}
81-
arcGenerator={arcGenerator}
82-
isInteractive={isInteractive}
83-
tooltip={tooltip}
84-
onClick={onClick}
85-
onMouseEnter={onMouseEnter}
86-
onMouseMove={onMouseMove}
87-
onMouseLeave={onMouseLeave}
88-
/>
89-
)
90-
})}
91-
</>
65+
<ArcsLayer<ComputedBar>
66+
center={center}
67+
data={bars}
68+
arcGenerator={arcGenerator}
69+
borderWidth={0}
70+
borderColor={'#000000'}
71+
transitionMode={transitionMode}
72+
onClick={isInteractive ? handleClick : undefined}
73+
onMouseEnter={isInteractive ? handleMouseEnter : undefined}
74+
onMouseMove={isInteractive ? handleMouseMove : undefined}
75+
onMouseLeave={isInteractive ? handleMouseLeave : undefined}
76+
/>
9277
)
9378
}

‎packages/radial-bar/src/hooks.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import { useMemo } from 'react'
22
import { scaleBand, scaleLinear } from 'd3-scale'
33
import { arc as d3Arc } from 'd3-shape'
44
import { degreesToRadians } from '@nivo/core'
5+
import { Arc } from '@nivo/arcs'
56
import { useOrdinalColorScale } from '@nivo/colors'
67
import { svgDefaultProps } from './props'
78
import {
89
ComputedBar,
910
RadialBarCommonProps,
1011
RadialBarDataProps,
1112
RadialBarSerie,
12-
RadialBarArcData,
1313
} from './types'
1414

1515
interface RadialBarGroup {
@@ -92,7 +92,7 @@ export const useRadialBar = ({
9292

9393
const arcGenerator = useMemo(
9494
() =>
95-
d3Arc<RadialBarArcData>()
95+
d3Arc<Arc>()
9696
.startAngle(d => degreesToRadians(d.startAngle))
9797
.endAngle(d => degreesToRadians(d.endAngle))
9898
.innerRadius(d => d.innerRadius)
@@ -120,10 +120,12 @@ export const useRadialBar = ({
120120
value: datum.y,
121121
color: '',
122122
stackedValue,
123-
startAngle: valueScale(currentValue),
124-
endAngle: valueScale(stackedValue),
125-
innerRadius,
126-
outerRadius,
123+
arc: {
124+
startAngle: valueScale(currentValue),
125+
endAngle: valueScale(stackedValue),
126+
innerRadius,
127+
outerRadius,
128+
},
127129
}
128130

129131
computedDatum.color = getColor(computedDatum)

‎packages/radial-bar/src/props.ts

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export const svgDefaultProps = {
1515

1616
animate: true,
1717
motionConfig: 'gentle' as const,
18+
transitionMode: 'startAngle' as const,
1819

1920
renderWrapper: true,
2021
}

‎packages/radial-bar/src/types.ts

+4-13
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { AriaAttributes, FunctionComponent, MouseEvent } from 'react'
22
import { Theme, Box, Dimensions, ModernMotionProps } from '@nivo/core'
3+
import { Arc, ArcTransitionMode } from '@nivo/arcs'
34
import { OrdinalColorScaleConfig } from '@nivo/colors'
4-
import { Arc } from 'd3-shape'
55

66
export interface RadialBarDatum {
77
x: string
@@ -21,10 +21,7 @@ export interface ComputedBar {
2121
value: number
2222
color: string
2323
stackedValue: number
24-
startAngle: number
25-
endAngle: number
26-
innerRadius: number
27-
outerRadius: number
24+
arc: Arc
2825
}
2926

3027
export interface RadialBarDataProps {
@@ -38,14 +35,6 @@ export interface RadialBarTooltipProps {
3835
}
3936
export type RadialBarTooltipComponent = FunctionComponent<RadialBarTooltipProps>
4037

41-
export interface RadialBarArcData {
42-
startAngle: number
43-
endAngle: number
44-
innerRadius: number
45-
outerRadius: number
46-
}
47-
export type RadialBarArcGenerator = Arc<unknown, RadialBarArcData>
48-
4938
export interface RadialBarCommonProps {
5039
margin: Box
5140

@@ -67,6 +56,8 @@ export interface RadialBarCommonProps {
6756

6857
renderWrapper: boolean
6958

59+
transitionMode: ArcTransitionMode
60+
7061
role: string
7162
ariaLabel: AriaAttributes['aria-label']
7263
ariaLabelledBy: AriaAttributes['aria-labelledby']

‎website/src/data/components/radial-bar/props.ts

+18
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { svgDefaultProps } from '@nivo/radial-bar'
2+
import { defaultProps } from '@nivo/pie'
3+
import { arcTransitionModes } from '@nivo/arcs'
24
import { themeProperty, motionProperties, groupProperties } from '../../../lib/componentProperties'
35
import { ChartProperty } from '../../../types'
46

@@ -285,6 +287,22 @@ const props: ChartProperty[] = [
285287
flavors: ['svg'],
286288
},
287289
...motionProperties(['svg'], svgDefaultProps, 'react-spring'),
290+
{
291+
key: 'transitionMode',
292+
flavors: ['svg'],
293+
help: 'Define how transitions behave.',
294+
type: 'string',
295+
required: false,
296+
defaultValue: defaultProps.transitionMode,
297+
controlType: 'choices',
298+
group: 'Motion',
299+
controlOptions: {
300+
choices: arcTransitionModes.map(choice => ({
301+
label: choice,
302+
value: choice,
303+
})),
304+
},
305+
},
288306
]
289307

290308
export const groups = groupProperties(props)

‎website/src/pages/radial-bar/index.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ const initialProperties: UnmappedRadarProps = {
3030
cornerRadius: 2,
3131

3232
animate: true,
33-
motionConfig: 'molasses',
33+
motionConfig: 'gentle' as const,
34+
transitionMode: 'pushOut' as const,
3435

3536
isInteractive: svgDefaultProps.isInteractive,
3637

0 commit comments

Comments
 (0)
Please sign in to comment.