Skip to content

Commit d897c35

Browse files
bl00mberM-IzadmehrBrian Vaughn
authored
[DevTools] Add Component Highlighting to Profiler (#18745)
Co-authored-by: Moji Izadmehr <[email protected]> Co-authored-by: Brian Vaughn <[email protected]>
1 parent 081b565 commit d897c35

File tree

4 files changed

+71
-18
lines changed

4 files changed

+71
-18
lines changed

packages/react-devtools-shared/src/devtools/views/Profiler/CommitFlamegraph.js

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import NoCommitData from './NoCommitData';
1616
import CommitFlamegraphListItem from './CommitFlamegraphListItem';
1717
import HoveredFiberInfo from './HoveredFiberInfo';
1818
import {scale} from './utils';
19+
import {useHighlightNativeElement} from '../hooks';
1920
import {StoreContext} from '../context';
2021
import {SettingsContext} from '../Settings/SettingsContext';
2122
import Tooltip from './Tooltip';
@@ -28,7 +29,8 @@ import type {CommitTree} from './types';
2829

2930
export type ItemData = {|
3031
chartData: ChartData,
31-
hoverFiber: (fiberData: TooltipFiberData | null) => void,
32+
onElementMouseEnter: (fiberData: TooltipFiberData) => void,
33+
onElementMouseLeave: () => void,
3234
scaleX: (value: number, fallbackValue: number) => number,
3335
selectedChartNode: ChartNode | null,
3436
selectedChartNodeIndex: number,
@@ -96,11 +98,16 @@ type Props = {|
9698
|};
9799

98100
function CommitFlamegraph({chartData, commitTree, height, width}: Props) {
99-
const [hoveredFiberData, hoverFiber] = useState<TooltipFiberData | null>(
100-
null,
101-
);
101+
const [
102+
hoveredFiberData,
103+
setHoveredFiberData,
104+
] = useState<TooltipFiberData | null>(null);
102105
const {lineHeight} = useContext(SettingsContext);
103106
const {selectFiber, selectedFiberID} = useContext(ProfilerContext);
107+
const {
108+
highlightNativeElement,
109+
clearHighlightNativeElement,
110+
} = useHighlightNativeElement();
104111

105112
const selectedChartNodeIndex = useMemo<number>(() => {
106113
if (selectedFiberID === null) {
@@ -123,10 +130,24 @@ function CommitFlamegraph({chartData, commitTree, height, width}: Props) {
123130
return null;
124131
}, [chartData, selectedFiberID, selectedChartNodeIndex]);
125132

133+
const handleElementMouseEnter = useCallback(
134+
({id, name}) => {
135+
highlightNativeElement(id); // Highlight last hovered element.
136+
setHoveredFiberData({id, name}); // Set hovered fiber data for tooltip
137+
},
138+
[highlightNativeElement],
139+
);
140+
141+
const handleElementMouseLeave = useCallback(() => {
142+
clearHighlightNativeElement(); // clear highlighting of element on mouse leave
143+
setHoveredFiberData(null); // clear hovered fiber data for tooltip
144+
}, [clearHighlightNativeElement]);
145+
126146
const itemData = useMemo<ItemData>(
127147
() => ({
128148
chartData,
129-
hoverFiber,
149+
onElementMouseEnter: handleElementMouseEnter,
150+
onElementMouseLeave: handleElementMouseLeave,
130151
scaleX: scale(
131152
0,
132153
selectedChartNode !== null
@@ -142,7 +163,8 @@ function CommitFlamegraph({chartData, commitTree, height, width}: Props) {
142163
}),
143164
[
144165
chartData,
145-
hoverFiber,
166+
handleElementMouseEnter,
167+
handleElementMouseLeave,
146168
selectedChartNode,
147169
selectedChartNodeIndex,
148170
selectFiber,

packages/react-devtools-shared/src/devtools/views/Profiler/CommitFlamegraphListItem.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ type Props = {
2828
function CommitFlamegraphListItem({data, index, style}: Props) {
2929
const {
3030
chartData,
31-
hoverFiber,
31+
onElementMouseEnter,
32+
onElementMouseLeave,
3233
scaleX,
3334
selectedChartNode,
3435
selectedChartNodeIndex,
@@ -49,11 +50,11 @@ function CommitFlamegraphListItem({data, index, style}: Props) {
4950

5051
const handleMouseEnter = (nodeData: ChartNodeType) => {
5152
const {id, name} = nodeData;
52-
hoverFiber({id, name});
53+
onElementMouseEnter({id, name});
5354
};
5455

5556
const handleMouseLeave = () => {
56-
hoverFiber(null);
57+
onElementMouseLeave();
5758
};
5859

5960
// List items are absolutely positioned using the CSS "top" attribute.

packages/react-devtools-shared/src/devtools/views/Profiler/CommitRanked.js

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import HoveredFiberInfo from './HoveredFiberInfo';
1818
import {scale} from './utils';
1919
import {StoreContext} from '../context';
2020
import {SettingsContext} from '../Settings/SettingsContext';
21+
import {useHighlightNativeElement} from '../hooks';
2122
import Tooltip from './Tooltip';
2223

2324
import styles from './CommitRanked.css';
@@ -28,7 +29,8 @@ import type {CommitTree} from './types';
2829

2930
export type ItemData = {|
3031
chartData: ChartData,
31-
hoverFiber: (fiberData: TooltipFiberData | null) => void,
32+
onElementMouseEnter: (fiberData: TooltipFiberData) => void,
33+
onElementMouseLeave: () => void,
3234
scaleX: (value: number, fallbackValue: number) => number,
3335
selectedFiberID: number | null,
3436
selectedFiberIndex: number,
@@ -94,28 +96,55 @@ type Props = {|
9496
|};
9597

9698
function CommitRanked({chartData, commitTree, height, width}: Props) {
97-
const [hoveredFiberData, hoverFiber] = useState<TooltipFiberData | null>(
98-
null,
99-
);
99+
const [
100+
hoveredFiberData,
101+
setHoveredFiberData,
102+
] = useState<TooltipFiberData | null>(null);
100103
const {lineHeight} = useContext(SettingsContext);
101104
const {selectedFiberID, selectFiber} = useContext(ProfilerContext);
105+
const {
106+
highlightNativeElement,
107+
clearHighlightNativeElement,
108+
} = useHighlightNativeElement();
102109

103110
const selectedFiberIndex = useMemo(
104111
() => getNodeIndex(chartData, selectedFiberID),
105112
[chartData, selectedFiberID],
106113
);
107114

115+
const handleElementMouseEnter = useCallback(
116+
({id, name}) => {
117+
highlightNativeElement(id); // Highlight last hovered element.
118+
setHoveredFiberData({id, name}); // Set hovered fiber data for tooltip
119+
},
120+
[highlightNativeElement],
121+
);
122+
123+
const handleElementMouseLeave = useCallback(() => {
124+
clearHighlightNativeElement(); // clear highlighting of element on mouse leave
125+
setHoveredFiberData(null); // clear hovered fiber data for tooltip
126+
}, [clearHighlightNativeElement]);
127+
108128
const itemData = useMemo<ItemData>(
109129
() => ({
110130
chartData,
111-
hoverFiber,
131+
onElementMouseEnter: handleElementMouseEnter,
132+
onElementMouseLeave: handleElementMouseLeave,
112133
scaleX: scale(0, chartData.nodes[selectedFiberIndex].value, 0, width),
113134
selectedFiberID,
114135
selectedFiberIndex,
115136
selectFiber,
116137
width,
117138
}),
118-
[chartData, selectedFiberID, selectedFiberIndex, selectFiber, width],
139+
[
140+
chartData,
141+
handleElementMouseEnter,
142+
handleElementMouseLeave,
143+
selectedFiberID,
144+
selectedFiberIndex,
145+
selectFiber,
146+
width,
147+
],
119148
);
120149

121150
// Tooltip used to show summary of fiber info on hover

packages/react-devtools-shared/src/devtools/views/Profiler/CommitRankedListItem.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ type Props = {
2727
function CommitRankedListItem({data, index, style}: Props) {
2828
const {
2929
chartData,
30-
hoverFiber,
30+
onElementMouseEnter,
31+
onElementMouseLeave,
3132
scaleX,
3233
selectedFiberIndex,
3334
selectFiber,
@@ -49,11 +50,11 @@ function CommitRankedListItem({data, index, style}: Props) {
4950

5051
const handleMouseEnter = () => {
5152
const {id, name} = node;
52-
hoverFiber({id, name});
53+
onElementMouseEnter({id, name});
5354
};
5455

5556
const handleMouseLeave = () => {
56-
hoverFiber(null);
57+
onElementMouseLeave();
5758
};
5859

5960
// List items are absolutely positioned using the CSS "top" attribute.

0 commit comments

Comments
 (0)