1
- import { useCallback , useRef , useEffect , createElement , MouseEvent , useMemo } from 'react'
1
+ import {
2
+ ForwardedRef ,
3
+ forwardRef ,
4
+ useCallback ,
5
+ useRef ,
6
+ useEffect ,
7
+ createElement ,
8
+ MouseEvent ,
9
+ useMemo ,
10
+ } from 'react'
2
11
import { getDistance , getRelativeCursor , Container , useDimensions , useTheme } from '@nivo/core'
3
12
import { useTooltip } from '@nivo/tooltip'
4
13
import { useComputedAnnotations , renderAnnotationsToCanvas } from '@nivo/annotations'
@@ -17,7 +26,9 @@ import {
17
26
type InnerNetworkCanvasProps < Node extends InputNode , Link extends InputLink > = Omit <
18
27
NetworkCanvasProps < Node , Link > ,
19
28
'renderWrapper' | 'theme'
20
- >
29
+ > & {
30
+ canvasRef : ForwardedRef < HTMLCanvasElement >
31
+ }
21
32
22
33
const InnerNetworkCanvas = < Node extends InputNode , Link extends InputLink > ( {
23
34
width,
@@ -56,6 +67,7 @@ const InnerNetworkCanvas = <Node extends InputNode, Link extends InputLink>({
56
67
defaultActiveNodeIds = canvasDefaultProps . defaultActiveNodeIds ,
57
68
nodeTooltip = canvasDefaultProps . nodeTooltip as NodeTooltip < Node > ,
58
69
onClick,
70
+ canvasRef,
59
71
} : InnerNetworkCanvasProps < Node , Link > ) => {
60
72
const canvasEl = useRef < HTMLCanvasElement | null > ( null )
61
73
const { margin, innerWidth, innerHeight, outerWidth, outerHeight } = useDimensions (
@@ -202,7 +214,10 @@ const InnerNetworkCanvas = <Node extends InputNode, Link extends InputLink>({
202
214
203
215
return (
204
216
< canvas
205
- ref = { canvasEl }
217
+ ref = { canvas => {
218
+ canvasEl . current = canvas
219
+ if ( canvasRef && 'current' in canvasRef ) canvasRef . current = canvas
220
+ } }
206
221
width = { outerWidth * pixelRatio }
207
222
height = { outerHeight * pixelRatio }
208
223
style = { {
@@ -218,18 +233,24 @@ const InnerNetworkCanvas = <Node extends InputNode, Link extends InputLink>({
218
233
)
219
234
}
220
235
221
- export const NetworkCanvas = <
222
- Node extends InputNode = InputNode ,
223
- Link extends InputLink = InputLink
224
- > ( {
225
- theme,
226
- isInteractive = canvasDefaultProps . isInteractive ,
227
- animate = canvasDefaultProps . animate ,
228
- motionConfig = canvasDefaultProps . motionConfig ,
229
- renderWrapper,
230
- ...otherProps
231
- } : NetworkCanvasProps < Node , Link > ) => (
232
- < Container { ...{ isInteractive, animate, motionConfig, theme, renderWrapper } } >
233
- < InnerNetworkCanvas < Node , Link > isInteractive = { isInteractive } { ...otherProps } />
234
- </ Container >
236
+ export const NetworkCanvas = forwardRef (
237
+ < Node extends InputNode = InputNode , Link extends InputLink = InputLink > (
238
+ {
239
+ theme,
240
+ isInteractive = canvasDefaultProps . isInteractive ,
241
+ animate = canvasDefaultProps . animate ,
242
+ motionConfig = canvasDefaultProps . motionConfig ,
243
+ renderWrapper,
244
+ ...otherProps
245
+ } : NetworkCanvasProps < Node , Link > ,
246
+ ref : ForwardedRef < HTMLCanvasElement >
247
+ ) => (
248
+ < Container { ...{ isInteractive, animate, motionConfig, theme, renderWrapper } } >
249
+ < InnerNetworkCanvas < Node , Link >
250
+ isInteractive = { isInteractive }
251
+ { ...otherProps }
252
+ canvasRef = { ref }
253
+ />
254
+ </ Container >
255
+ )
235
256
)
0 commit comments