Skip to content

Commit 020a6f9

Browse files
author
zhusiyi
committed
DevTools: Make the selected commit label editable
1 parent 1a106bd commit 020a6f9

File tree

1 file changed

+61
-8
lines changed

1 file changed

+61
-8
lines changed

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

Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*/
99

1010
import * as React from 'react';
11-
import {Fragment, useCallback, useContext, useMemo} from 'react';
11+
import {Fragment, useCallback, useContext, useMemo, useRef} from 'react';
1212
import Button from '../Button';
1313
import ButtonIcon from '../ButtonIcon';
1414
import {ProfilerContext} from './ProfilerContext';
@@ -31,6 +31,7 @@ export default function SnapshotSelector(_: Props) {
3131

3232
const {profilerStore} = useContext(StoreContext);
3333
const {commitData} = profilerStore.getDataForRoot(((rootID: any): number));
34+
const selectedCommitInputRef = useRef();
3435

3536
const totalDurations: Array<number> = [];
3637
const commitTimes: Array<number> = [];
@@ -85,14 +86,66 @@ export default function SnapshotSelector(_: Props) {
8586
}
8687

8788
let label = null;
89+
90+
const formatSelectedIndex = useCallback((seletedIndex, digits) => {
91+
return `${seletedIndex + 1}`.padStart(digits, '0');
92+
}, []);
93+
94+
const handleSelectedInputKeyDown = useCallback(event => {
95+
const {target, key} = event;
96+
if (key === 'Enter') {
97+
target.blur();
98+
}
99+
}, []);
100+
101+
const handleSelectedInputBlur = useCallback(
102+
event => {
103+
let {innerHTML: value} = event.target;
104+
value = value.trim();
105+
if (/^\d+$/.test(value)) {
106+
const num = +value;
107+
if (num > 0 && num <= filteredCommitIndices.length) {
108+
selectCommitIndex(num - 1);
109+
return;
110+
}
111+
}
112+
// If the value is illegal, revert it.
113+
selectCommitIndex(selectedCommitIndex);
114+
const el = selectedCommitInputRef.current;
115+
if (el) {
116+
el.innerHTML = formatSelectedIndex(
117+
selectedFilteredCommitIndex,
118+
`${numFilteredCommits}`.length,
119+
);
120+
}
121+
},
122+
[
123+
filteredCommitIndices,
124+
selectCommitIndex,
125+
selectedCommitIndex,
126+
selectedFilteredCommitIndex,
127+
numFilteredCommits,
128+
],
129+
);
130+
88131
if (numFilteredCommits > 0) {
89-
label =
90-
`${selectedFilteredCommitIndex + 1}`.padStart(
91-
`${numFilteredCommits}`.length,
92-
'0',
93-
) +
94-
' / ' +
95-
numFilteredCommits;
132+
label = (
133+
<>
134+
<span
135+
contentEditable={true}
136+
suppressContentEditableWarning={true}
137+
ref={selectedCommitInputRef}
138+
onKeyDown={handleSelectedInputKeyDown}
139+
onBlur={handleSelectedInputBlur}>
140+
{formatSelectedIndex(
141+
selectedFilteredCommitIndex,
142+
`${numFilteredCommits}`.length,
143+
)}
144+
</span>
145+
{' / '}
146+
{numFilteredCommits}
147+
</>
148+
);
96149
}
97150

98151
const viewNextCommit = useCallback(() => {

0 commit comments

Comments
 (0)