Skip to content

Commit 61ec5d5

Browse files
authored
Merge pull request #365 from reaviz/anton/hover-update
Fix for Hover/Active State on Edge #364
2 parents 1d3a88b + 52658d6 commit 61ec5d5

File tree

4 files changed

+33
-4
lines changed

4 files changed

+33
-4
lines changed

src/store.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ export interface GraphState {
3434
selections?: string[];
3535
// The node that is currently hovered, used to disable cluster dragging
3636
hoveredNodeId?: string;
37+
// The edges that are currently hovered over, required for cases when animation is disabled
38+
hoveredEdgeIds?: string[];
3739
edgeContextMenus?: Set<string>;
3840
setEdgeContextMenus: (edges: Set<string>) => void;
3941
edgeMeshes: Array<Mesh<BufferGeometry>>;
@@ -51,6 +53,7 @@ export interface GraphState {
5153
setActives: (actives: string[]) => void;
5254
setSelections: (selections: string[]) => void;
5355
setHoveredNodeId: (hoveredNodeId: string | null) => void;
56+
setHoveredEdgeIds: (hoveredEdgeIds: string[] | null) => void;
5457
setNodes: (nodes: InternalGraphNode[]) => void;
5558
setEdges: (edges: InternalGraphEdge[]) => void;
5659
setNodePosition: (id: string, position: InternalGraphPosition) => void;
@@ -83,6 +86,7 @@ export const createStore = ({
8386
panning: false,
8487
draggingIds: [],
8588
actives,
89+
hoveredEdgeIds: [],
8690
edgeContextMenus: new Set(),
8791
edgeMeshes: [],
8892
selections,
@@ -110,6 +114,8 @@ export const createStore = ({
110114
setSelections: selections => set(state => ({ ...state, selections })),
111115
setHoveredNodeId: hoveredNodeId =>
112116
set(state => ({ ...state, hoveredNodeId })),
117+
setHoveredEdgeIds: hoveredEdgeIds =>
118+
set(state => ({ ...state, hoveredEdgeIds })),
113119
setNodes: nodes =>
114120
set(state => ({
115121
...state,

src/symbols/edges/Edges.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ export const Edges: FC<EdgesProps> = ({
106106
const setEdgeMeshes = useStore(state => state.setEdgeMeshes);
107107
const actives = useStore(state => state.actives || []);
108108
const selections = useStore(state => state.selections || []);
109+
const hoveredEdgeIds = useStore(state => state.hoveredEdgeIds || []);
109110

110111
const [active, inactive, draggingActive, draggingInactive] = useMemo(() => {
111112
const active: Array<InternalGraphEdge> = [];
@@ -117,22 +118,30 @@ export const Edges: FC<EdgesProps> = ({
117118
draggingIds.includes(edge.source) ||
118119
draggingIds.includes(edge.target)
119120
) {
120-
if (selections.includes(edge.id) || actives.includes(edge.id)) {
121+
if (
122+
selections.includes(edge.id) ||
123+
actives.includes(edge.id) ||
124+
hoveredEdgeIds.includes(edge.id)
125+
) {
121126
draggingActive.push(edge);
122127
} else {
123128
draggingInactive.push(edge);
124129
}
125130
return;
126131
}
127132

128-
if (selections.includes(edge.id) || actives.includes(edge.id)) {
133+
if (
134+
selections.includes(edge.id) ||
135+
actives.includes(edge.id) ||
136+
hoveredEdgeIds.includes(edge.id)
137+
) {
129138
active.push(edge);
130139
} else {
131140
inactive.push(edge);
132141
}
133142
});
134143
return [active, inactive, draggingActive, draggingInactive];
135-
}, [edges, actives, selections, draggingIds]);
144+
}, [edges, actives, selections, draggingIds, hoveredEdgeIds]);
136145

137146
const hasSelections = !!selections.length;
138147

src/symbols/edges/useEdgeEvents.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ export function useEdgeEvents(
2424
const setEdgeContextMenus = useStore(
2525
useCallback(state => state.setEdgeContextMenus, [])
2626
);
27+
const setHoveredEdgeIds = useStore(
28+
useCallback(state => state.setHoveredEdgeIds, [])
29+
);
2730

2831
const clickRef = useRef(false);
2932
const handleClick = useCallback(() => {
@@ -72,6 +75,10 @@ export function useEdgeEvents(
7275
}
7376
}
7477

78+
const hoveredIds =
79+
intersected.length > 0 ? intersected.map(edge => edge.id) : [];
80+
setHoveredEdgeIds(hoveredIds);
81+
7582
if (onPointerOver) {
7683
const over = intersected.filter(index => !previous.includes(index));
7784
over.forEach(edge => {
@@ -86,7 +93,13 @@ export function useEdgeEvents(
8693
});
8794
}
8895
},
89-
[contextMenu, disabled, edgeContextMenus, setEdgeContextMenus]
96+
[
97+
contextMenu,
98+
disabled,
99+
edgeContextMenus,
100+
setEdgeContextMenus,
101+
setHoveredEdgeIds
102+
]
90103
);
91104

92105
return {

stories/demos/HoverHighlightTypes.story.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ export const Outwards = () => {
6666
return (
6767
<GraphCanvas
6868
ref={graphRef}
69+
animated={false}
6970
nodes={complexNodes}
7071
edges={complexEdges}
7172
selections={selections}

0 commit comments

Comments
 (0)