Skip to content

Commit 943b83d

Browse files
committed
Fix: Prevent graph re-render on node click, Adjust: Optimize node spacing for better visual clarity
1 parent 009d782 commit 943b83d

File tree

2 files changed

+44
-53
lines changed

2 files changed

+44
-53
lines changed

src/modules/universe/NeuroJsonGraph.tsx

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,10 @@ export const DATA_TYPE_COLORS: Record<string, [number, number, number]> = {
4444
const NeuroJsonGraph: React.FC<{
4545
registry: Database[];
4646
onNodeClick?: (node: NodeObject) => void;
47-
}> = ({ registry, onNodeClick }) => {
47+
}> = React.memo(({ registry, onNodeClick }) => {
4848
const navigate = useNavigate();
4949
const graphRef = useRef<HTMLDivElement>(null);
5050

51-
// Define the datatype to color mapping
52-
// const DATA_TYPE_COLORS: Record<string, [number, number, number]> = {
53-
// // mri: [79, 51, 130], // deep purple
54-
// mri: [160, 138, 233], // soft laender
55-
// anat: [160, 138, 233],
56-
// // fmri: [10, 81, 20], // dark green
57-
// fmri: [152, 202, 32], // bright lime green
58-
// func: [152, 202, 32],
59-
60-
// pet: [0, 105, 192], // deep blue
61-
// meg: [156, 57, 0], // dark reddish-brown
62-
// eeg: [134, 31, 55], // dark red-pink
63-
// ieeg: [18, 109, 62], // forest green
64-
// beh: [12, 93, 210], // bright blue
65-
// fmap: [255, 255, 59], // vivid yellow
66-
// dwi: [200, 9, 12], // deep red
67-
// fnirs: [255, 193, 7], // golden yellow
68-
// phenotype: [255, 87, 34], // vibrant orange-red
69-
// };
70-
7151
// Function to blend colors based on datatypes
7252
const blendColors = (datatypes: string[]): string => {
7353
if (datatypes.length === 0) return "rgb(255,255,255)"; // Default white
@@ -199,7 +179,7 @@ const NeuroJsonGraph: React.FC<{
199179
.graphData(graphData)
200180
.nodeRelSize(1)
201181
.nodeColor((node) => (node as NodeObject).color)
202-
.linkWidth(2)
182+
.linkWidth(1)
203183
.backgroundColor("rgba(0,0,0,0)")
204184
.nodeLabel("name")
205185
.onNodeHover((node) => {
@@ -265,6 +245,8 @@ const NeuroJsonGraph: React.FC<{
265245
return group;
266246
});
267247

248+
Graph.d3Force("link")?.distance(100);
249+
268250
// Initialize CSS2DRenderer for 2D labels
269251
const labelRenderer = new CSS2DRenderer();
270252
labelRenderer.setSize(window.innerWidth, window.innerHeight);
@@ -310,6 +292,6 @@ const NeuroJsonGraph: React.FC<{
310292
}}
311293
/>
312294
);
313-
};
295+
});
314296

315297
export default NeuroJsonGraph;

src/pages/Home.tsx

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { useAppDispatch } from "hooks/useAppDispatch";
1515
import { useAppSelector } from "hooks/useAppSelector";
1616
import NeuroJsonGraph from "modules/universe/NeuroJsonGraph";
1717
import { NodeObject } from "modules/universe/NeuroJsonGraph";
18-
import React, { useEffect, useState } from "react";
18+
import React, { useEffect, useState, useCallback, useMemo } from "react";
1919
import { useNavigate } from "react-router-dom";
2020
import { fetchRegistry } from "redux/neurojson/neurojson.action";
2121
import { NeurojsonSelector } from "redux/neurojson/neurojson.selector";
@@ -36,41 +36,50 @@ const Home: React.FC = () => {
3636
}, [dispatch]);
3737

3838
// Handle node click: Set selected node and open panel
39-
const handleNodeClick = (node: NodeObject) => {
39+
// const handleNodeClick = (node: NodeObject) => {
40+
// setSelectedNode(node);
41+
// setPanelOpen(true);
42+
// };
43+
const handleNodeClick = useCallback((node: NodeObject) => {
4044
setSelectedNode(node);
4145
setPanelOpen(true);
42-
};
43-
44-
// const filteredRegistry = registry
45-
// ? registry.filter((node) =>
46-
// node.name.toLowerCase().includes(filterKeyword.toLowerCase())
47-
// )
48-
// : [];
46+
}, []);
4947

5048
// filter logic
51-
const filteredRegistry = registry
52-
? registry.filter((node) => {
53-
const matchKeyword = node.name
54-
.toLowerCase()
55-
.includes(filterKeyword.toLowerCase());
56-
const matchModalities =
57-
selectedModalities.length === 0 ||
58-
// selectedModalities.some((modality) =>
59-
// node.datatype.includes(modality)
60-
// );
61-
selectedModalities.some((modality) =>
62-
Array.isArray(node.datatype)
63-
? node.datatype.includes(modality)
64-
: node.datatype === modality
65-
);
49+
// const filteredRegistry = registry
50+
// ? registry.filter((node) => {
51+
// const matchKeyword = node.name
52+
// .toLowerCase()
53+
// .includes(filterKeyword.toLowerCase());
54+
// const matchModalities =
55+
// selectedModalities.length === 0 ||
56+
// selectedModalities.some((modality) =>
57+
// Array.isArray(node.datatype)
58+
// ? node.datatype.includes(modality)
59+
// : node.datatype === modality
60+
// );
6661

67-
return matchKeyword && matchModalities;
68-
})
69-
: [];
62+
// return matchKeyword && matchModalities;
63+
// })
64+
// : [];
7065

71-
// const handleModalitiesFilter = (modalities: string[]) => {
72-
// setSelectedModalities(modalities);
73-
// };
66+
const filteredRegistry = useMemo(() => {
67+
return registry
68+
? registry.filter((node) => {
69+
const matchKeyword = node.name
70+
.toLowerCase()
71+
.includes(filterKeyword.toLowerCase());
72+
const matchModalities =
73+
selectedModalities.length === 0 ||
74+
selectedModalities.some((modality) =>
75+
Array.isArray(node.datatype)
76+
? node.datatype.includes(modality)
77+
: node.datatype === modality
78+
);
79+
return matchKeyword && matchModalities;
80+
})
81+
: [];
82+
}, [registry, filterKeyword, selectedModalities]);
7483

7584
return (
7685
<Container

0 commit comments

Comments
 (0)