Skip to content

Commit 1614972

Browse files
bl00mberM-Izadmehr
authored and
Brian Vaughn
committed
add component highlighting
Co-authored-by: Moji Izadmehr <m.eezadmehr@gmail.com>
1 parent 081b565 commit 1614972

File tree

5 files changed

+78
-19
lines changed

5 files changed

+78
-19
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type Props = {|
1515
color: string,
1616
height: number,
1717
isDimmed?: boolean,
18+
isHovered?: boolean,
1819
label: string,
1920
onClick: (event: SyntheticMouseEvent<*>) => mixed,
2021
onDoubleClick?: (event: SyntheticMouseEvent<*>) => mixed,
@@ -33,6 +34,7 @@ export default function ChartNode({
3334
color,
3435
height,
3536
isDimmed = false,
37+
isHovered = false,
3638
label,
3739
onClick,
3840
onMouseEnter,
@@ -55,7 +57,7 @@ export default function ChartNode({
5557
onDoubleClick={onDoubleClick}
5658
className={styles.Rect}
5759
style={{
58-
opacity: isDimmed ? 0.5 : 1,
60+
opacity: isHovered ? 0.75 : isDimmed ? 0.5 : 1,
5961
}}
6062
/>
6163
{width >= minWidthToDisplay && (

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,9 @@ import type {CommitTree} from './types';
2829

2930
export type ItemData = {|
3031
chartData: ChartData,
31-
hoverFiber: (fiberData: TooltipFiberData | null) => void,
32+
isHovered: boolean,
33+
onElementMouseEnter: (fiberData: TooltipFiberData) => void,
34+
onElementMouseLeave: () => void,
3235
scaleX: (value: number, fallbackValue: number) => number,
3336
selectedChartNode: ChartNode | null,
3437
selectedChartNodeIndex: number,
@@ -96,11 +99,16 @@ type Props = {|
9699
|};
97100

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

105113
const selectedChartNodeIndex = useMemo<number>(() => {
106114
if (selectedFiberID === null) {
@@ -123,10 +131,22 @@ function CommitFlamegraph({chartData, commitTree, height, width}: Props) {
123131
return null;
124132
}, [chartData, selectedFiberID, selectedChartNodeIndex]);
125133

134+
const handleElementMouseEnter = ({id, name}) => {
135+
highlightNativeElement(id); // Highlight last hovered element.
136+
setHoveredFiberData({id, name}); // Set hovered fiber data for tooltip
137+
};
138+
139+
const handleElementMouseLeave = () => {
140+
clearHighlightNativeElement(); // clear highlighting of element on mouse leave
141+
setHoveredFiberData(null); // clear hovered fiber data for tooltip
142+
};
143+
126144
const itemData = useMemo<ItemData>(
127145
() => ({
128146
chartData,
129-
hoverFiber,
147+
isHovered: hoveredFiberData !== null,
148+
onElementMouseEnter: handleElementMouseEnter,
149+
onElementMouseLeave: handleElementMouseLeave,
130150
scaleX: scale(
131151
0,
132152
selectedChartNode !== null
@@ -142,7 +162,9 @@ function CommitFlamegraph({chartData, commitTree, height, width}: Props) {
142162
}),
143163
[
144164
chartData,
145-
hoverFiber,
165+
hoveredFiberData,
166+
handleElementMouseEnter,
167+
handleElementMouseLeave,
146168
selectedChartNode,
147169
selectedChartNodeIndex,
148170
selectFiber,

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ type Props = {
2828
function CommitFlamegraphListItem({data, index, style}: Props) {
2929
const {
3030
chartData,
31-
hoverFiber,
31+
isHovered,
32+
onElementMouseEnter,
33+
onElementMouseLeave,
3234
scaleX,
3335
selectedChartNode,
3436
selectedChartNodeIndex,
@@ -49,11 +51,11 @@ function CommitFlamegraphListItem({data, index, style}: Props) {
4951

5052
const handleMouseEnter = (nodeData: ChartNodeType) => {
5153
const {id, name} = nodeData;
52-
hoverFiber({id, name});
54+
onElementMouseEnter({id, name});
5355
};
5456

5557
const handleMouseLeave = () => {
56-
hoverFiber(null);
58+
onElementMouseLeave();
5759
};
5860

5961
// List items are absolutely positioned using the CSS "top" attribute.
@@ -114,6 +116,7 @@ function CommitFlamegraphListItem({data, index, style}: Props) {
114116
color={color}
115117
height={lineHeight}
116118
isDimmed={index < selectedChartNodeIndex}
119+
isHovered={isHovered}
117120
key={id}
118121
label={label}
119122
onClick={event => handleClick(event, id, name)}

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,9 @@ import type {CommitTree} from './types';
2829

2930
export type ItemData = {|
3031
chartData: ChartData,
31-
hoverFiber: (fiberData: TooltipFiberData | null) => void,
32+
isHovered: boolean,
33+
onElementMouseEnter: (fiberData: TooltipFiberData) => void,
34+
onElementMouseLeave: () => void,
3235
scaleX: (value: number, fallbackValue: number) => number,
3336
selectedFiberID: number | null,
3437
selectedFiberIndex: number,
@@ -94,28 +97,54 @@ type Props = {|
9497
|};
9598

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

103111
const selectedFiberIndex = useMemo(
104112
() => getNodeIndex(chartData, selectedFiberID),
105113
[chartData, selectedFiberID],
106114
);
107115

116+
const handleElementMouseEnter = ({id, name}) => {
117+
highlightNativeElement(id); // Highlight last hovered element.
118+
setHoveredFiberData({id, name}); // Set hovered fiber data for tooltip
119+
};
120+
121+
const handleElementMouseLeave = () => {
122+
clearHighlightNativeElement(); // clear highlighting of element on mouse leave
123+
setHoveredFiberData(null); // clear hovered fiber data for tooltip
124+
};
125+
108126
const itemData = useMemo<ItemData>(
109127
() => ({
110128
chartData,
111-
hoverFiber,
129+
isHovered: hoveredFiberData !== null,
130+
onElementMouseEnter: handleElementMouseEnter,
131+
onElementMouseLeave: handleElementMouseLeave,
112132
scaleX: scale(0, chartData.nodes[selectedFiberIndex].value, 0, width),
113133
selectedFiberID,
114134
selectedFiberIndex,
115135
selectFiber,
116136
width,
117137
}),
118-
[chartData, selectedFiberID, selectedFiberIndex, selectFiber, width],
138+
[
139+
chartData,
140+
hoveredFiberData,
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: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ type Props = {
2727
function CommitRankedListItem({data, index, style}: Props) {
2828
const {
2929
chartData,
30-
hoverFiber,
30+
isHovered,
31+
onElementMouseEnter,
32+
onElementMouseLeave,
3133
scaleX,
3234
selectedFiberIndex,
3335
selectFiber,
@@ -49,11 +51,11 @@ function CommitRankedListItem({data, index, style}: Props) {
4951

5052
const handleMouseEnter = () => {
5153
const {id, name} = node;
52-
hoverFiber({id, name});
54+
onElementMouseEnter({id, name});
5355
};
5456

5557
const handleMouseLeave = () => {
56-
hoverFiber(null);
58+
onElementMouseLeave();
5759
};
5860

5961
// List items are absolutely positioned using the CSS "top" attribute.
@@ -67,6 +69,7 @@ function CommitRankedListItem({data, index, style}: Props) {
6769
color={getGradientColor(node.value / chartData.maxValue)}
6870
height={lineHeight}
6971
isDimmed={index < selectedFiberIndex}
72+
isHovered={isHovered}
7073
key={node.id}
7174
label={node.label}
7275
onClick={handleClick}

0 commit comments

Comments
 (0)