1
1
import { useCallback , useRef , useEffect , createElement , MouseEvent } from 'react'
2
2
import { getDistance , getRelativeCursor , Container , useDimensions , useTheme } from '@nivo/core'
3
3
import { useTooltip } from '@nivo/tooltip'
4
+ import { useComputedAnnotations , renderAnnotationsToCanvas } from '@nivo/annotations'
4
5
import { canvasDefaultProps } from './defaults'
5
- import { useNetwork } from './hooks'
6
- import { NetworkCanvasProps , InputNode , NodeTooltip , InputLink } from './types'
6
+ import { useNetwork , useNodeAnnotations } from './hooks'
7
+ import {
8
+ NetworkCanvasProps ,
9
+ InputNode ,
10
+ ComputedNode ,
11
+ NodeTooltip ,
12
+ InputLink ,
13
+ NetworkSvgProps ,
14
+ } from './types'
7
15
8
16
type InnerNetworkCanvasProps < Node extends InputNode , Link extends InputLink > = Omit <
9
17
NetworkCanvasProps < Node , Link > ,
@@ -39,6 +47,10 @@ const InnerNetworkCanvas = <Node extends InputNode, Link extends InputLink>({
39
47
linkThickness = canvasDefaultProps . linkThickness ,
40
48
linkColor = canvasDefaultProps . linkColor ,
41
49
50
+ annotations = canvasDefaultProps . annotations as NonNullable <
51
+ NetworkSvgProps < Node , Link > [ 'annotations' ]
52
+ > ,
53
+
42
54
isInteractive = canvasDefaultProps . isInteractive ,
43
55
nodeTooltip = canvasDefaultProps . nodeTooltip as NodeTooltip < Node > ,
44
56
onClick,
@@ -70,6 +82,11 @@ const InnerNetworkCanvas = <Node extends InputNode, Link extends InputLink>({
70
82
linkColor,
71
83
} )
72
84
85
+ const boundAnnotations = useNodeAnnotations < Node > ( nodes ! , annotations )
86
+ const computedAnnotations = useComputedAnnotations < ComputedNode < Node > > ( {
87
+ annotations : boundAnnotations ,
88
+ } )
89
+
73
90
const theme = useTheme ( )
74
91
75
92
useEffect ( ( ) => {
@@ -91,6 +108,11 @@ const InnerNetworkCanvas = <Node extends InputNode, Link extends InputLink>({
91
108
links . forEach ( link => renderLink ( ctx , link ) )
92
109
} else if ( layer === 'nodes' && nodes !== null ) {
93
110
nodes . forEach ( node => renderNode ( ctx , node ) )
111
+ } else if ( layer === 'annotations' ) {
112
+ renderAnnotationsToCanvas < ComputedNode < Node > > ( ctx , {
113
+ annotations : computedAnnotations as any ,
114
+ theme,
115
+ } )
94
116
} else if ( typeof layer === 'function' && nodes !== null && links !== null ) {
95
117
layer ( ctx , {
96
118
// ...props,
@@ -112,6 +134,7 @@ const InnerNetworkCanvas = <Node extends InputNode, Link extends InputLink>({
112
134
links ,
113
135
renderNode ,
114
136
renderLink ,
137
+ computedAnnotations ,
115
138
] )
116
139
117
140
const getNodeFromMouseEvent = useCallback (
0 commit comments