1
- import { Fragment , ReactNode , useCallback , createElement } from 'react'
1
+ import { Fragment , ReactNode , createElement , useMemo } from 'react'
2
2
import { Container , useDimensions , SvgWrapper } from '@nivo/core'
3
- import { useTooltip } from '@nivo/tooltip'
4
3
import { svgDefaultProps } from './defaults'
5
4
import { useNetwork } from './hooks'
6
5
import { NetworkLinks } from './NetworkLinks'
7
6
import { NetworkNodes } from './NetworkNodes'
8
7
import { NetworkNodeAnnotations } from './NetworkNodeAnnotations'
9
- import { InputNode , LayerId , NodeTooltip , NetworkSvgProps , ComputedNode , InputLink } from './types'
8
+ import {
9
+ InputNode ,
10
+ LayerId ,
11
+ NodeTooltip ,
12
+ NetworkSvgProps ,
13
+ InputLink ,
14
+ CustomLayerProps ,
15
+ } from './types'
10
16
11
17
type InnerNetworkProps < Node extends InputNode , Link extends InputLink > = Omit <
12
18
NetworkSvgProps < Node , Link > ,
@@ -51,7 +57,11 @@ const InnerNetwork = <Node extends InputNode, Link extends InputLink>({
51
57
> ,
52
58
53
59
isInteractive = svgDefaultProps . isInteractive ,
60
+ defaultActiveNodeIds = svgDefaultProps . defaultActiveNodeIds ,
54
61
nodeTooltip = svgDefaultProps . nodeTooltip as NodeTooltip < Node > ,
62
+ onMouseEnter,
63
+ onMouseMove,
64
+ onMouseLeave,
55
65
onClick,
56
66
57
67
role = svgDefaultProps . role ,
@@ -65,7 +75,7 @@ const InnerNetwork = <Node extends InputNode, Link extends InputLink>({
65
75
partialMargin
66
76
)
67
77
68
- const { nodes, links, setActiveNodeIds } = useNetwork < Node , Link > ( {
78
+ const { nodes, links, activeNodeIds , setActiveNodeIds } = useNetwork < Node , Link > ( {
69
79
center : [ innerWidth / 2 , innerHeight / 2 ] ,
70
80
nodes : rawNodes ,
71
81
links : rawLinks ,
@@ -83,23 +93,10 @@ const InnerNetwork = <Node extends InputNode, Link extends InputLink>({
83
93
nodeBorderColor,
84
94
linkThickness,
85
95
linkColor,
96
+ isInteractive,
97
+ defaultActiveNodeIds,
86
98
} )
87
99
88
- const { showTooltipFromEvent, hideTooltip } = useTooltip ( )
89
-
90
- const handleNodeHover = useCallback (
91
- ( node : ComputedNode < Node > , event ) => {
92
- showTooltipFromEvent ( createElement ( nodeTooltip , { node } ) , event )
93
- setActiveNodeIds ( [ node . id ] )
94
- } ,
95
- [ showTooltipFromEvent , nodeTooltip , setActiveNodeIds ]
96
- )
97
-
98
- const handleNodeLeave = useCallback ( ( ) => {
99
- hideTooltip ( )
100
- setActiveNodeIds ( [ ] )
101
- } , [ hideTooltip , setActiveNodeIds ] )
102
-
103
100
const layerById : Record < LayerId , ReactNode > = {
104
101
links : null ,
105
102
nodes : null ,
@@ -119,14 +116,17 @@ const InnerNetwork = <Node extends InputNode, Link extends InputLink>({
119
116
120
117
if ( layers . includes ( 'nodes' ) && nodes !== null ) {
121
118
layerById . nodes = (
122
- < NetworkNodes < Node >
119
+ < NetworkNodes < Node , Link >
123
120
key = "nodes"
124
121
nodes = { nodes }
125
122
nodeComponent = { nodeComponent }
126
- onClick = { isInteractive ? onClick : undefined }
127
- onMouseEnter = { isInteractive ? handleNodeHover : undefined }
128
- onMouseMove = { isInteractive ? handleNodeHover : undefined }
129
- onMouseLeave = { isInteractive ? handleNodeLeave : undefined }
123
+ onMouseEnter = { onMouseEnter }
124
+ onMouseMove = { onMouseMove }
125
+ onMouseLeave = { onMouseLeave }
126
+ onClick = { onClick }
127
+ tooltip = { nodeTooltip }
128
+ setActiveNodeIds = { setActiveNodeIds }
129
+ isInteractive = { isInteractive }
130
130
/>
131
131
)
132
132
}
@@ -141,6 +141,16 @@ const InnerNetwork = <Node extends InputNode, Link extends InputLink>({
141
141
)
142
142
}
143
143
144
+ const customLayerProps : CustomLayerProps < Node , Link > = useMemo (
145
+ ( ) => ( {
146
+ nodes : nodes || [ ] ,
147
+ links : links || [ ] ,
148
+ activeNodeIds,
149
+ setActiveNodeIds,
150
+ } ) ,
151
+ [ nodes , links , activeNodeIds , setActiveNodeIds ]
152
+ )
153
+
144
154
return (
145
155
< SvgWrapper
146
156
width = { outerWidth }
@@ -153,17 +163,7 @@ const InnerNetwork = <Node extends InputNode, Link extends InputLink>({
153
163
>
154
164
{ layers . map ( ( layer , i ) => {
155
165
if ( typeof layer === 'function' ) {
156
- return (
157
- < Fragment key = { i } >
158
- { createElement ( layer , {
159
- // ...props,
160
- // innerWidth,
161
- // innerHeight,
162
- nodes : nodes || [ ] ,
163
- links : links || [ ] ,
164
- } ) }
165
- </ Fragment >
166
- )
166
+ return < Fragment key = { i } > { createElement ( layer , customLayerProps ) } </ Fragment >
167
167
}
168
168
169
169
return layerById ?. [ layer ] ?? null
0 commit comments