Skip to content

Commit 205294b

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

File tree

1 file changed

+58
-8
lines changed

1 file changed

+58
-8
lines changed

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

Lines changed: 58 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,63 @@ export default function SnapshotSelector(_: Props) {
8586
}
8687

8788
let label = null;
88-
if (numFilteredCommits > 0) {
89-
label =
90-
`${selectedFilteredCommitIndex + 1}`.padStart(
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+
selectedCommitInputRef.current.innerHTML = formatSelectedIndex(
115+
selectedFilteredCommitIndex,
91116
`${numFilteredCommits}`.length,
92-
'0',
93-
) +
94-
' / ' +
95-
numFilteredCommits;
117+
);
118+
},
119+
[
120+
filteredCommitIndices,
121+
selectCommitIndex,
122+
selectedCommitIndex,
123+
selectedFilteredCommitIndex,
124+
numFilteredCommits,
125+
],
126+
);
127+
128+
if (numFilteredCommits > 0) {
129+
label = (
130+
<>
131+
<span
132+
contentEditable={true}
133+
suppressContentEditableWarning={true}
134+
ref={selectedCommitInputRef}
135+
onKeyDown={handleSelectedInputKeyDown}
136+
onBlur={handleSelectedInputBlur}>
137+
{formatSelectedIndex(
138+
selectedFilteredCommitIndex,
139+
`${numFilteredCommits}`.length,
140+
)}
141+
</span>
142+
{' / '}
143+
{numFilteredCommits}
144+
</>
145+
);
96146
}
97147

98148
const viewNextCommit = useCallback(() => {

0 commit comments

Comments
 (0)