Skip to content

Commit 232c67e

Browse files
srubinBrian Vaughn
and
Brian Vaughn
authored
Devtools Profiler: allow user to enter commit number (#19957)
Co-authored-by: Brian Vaughn <[email protected]>
1 parent 87b3ada commit 232c67e

File tree

2 files changed

+87
-29
lines changed

2 files changed

+87
-29
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,19 @@
2828
justify-content: center;
2929
color: var(--color-dim);
3030
}
31+
32+
.Input {
33+
background: none;
34+
font-size: var(--font-size-sans-normal);
35+
text-align: right;
36+
font-family: var(--font-family-monospace);
37+
border: 1px solid transparent;
38+
border-radius: 0.125rem;
39+
padding: 0.125rem;
40+
color: var(--color-attribute-editable-value);
41+
}
42+
43+
.Input:focus {
44+
background-color: var(--color-button-background-focus);
45+
outline: none;
46+
}

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

Lines changed: 71 additions & 29 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, useContext, useMemo} from 'react';
1212
import Button from '../Button';
1313
import ButtonIcon from '../ButtonIcon';
1414
import {ProfilerContext} from './ProfilerContext';
@@ -86,47 +86,89 @@ export default function SnapshotSelector(_: Props) {
8686

8787
let label = null;
8888
if (numFilteredCommits > 0) {
89-
label =
90-
`${selectedFilteredCommitIndex + 1}`.padStart(
91-
`${numFilteredCommits}`.length,
92-
'0',
93-
) +
94-
' / ' +
95-
numFilteredCommits;
89+
const handleCommitInputChange = event => {
90+
const value = parseInt(event.currentTarget.value, 10);
91+
if (!isNaN(value)) {
92+
const filteredIndex = Math.min(
93+
Math.max(value - 1, 0),
94+
95+
// Snashots are shown to the user as 1-based
96+
// but the indices within the profiler data array ar 0-based.
97+
numFilteredCommits - 1,
98+
);
99+
selectCommitIndex(filteredCommitIndices[filteredIndex]);
100+
}
101+
};
102+
103+
const handleClick = event => {
104+
event.currentTarget.select();
105+
};
106+
107+
const handleKeyDown = event => {
108+
switch (event.key) {
109+
case 'ArrowDown':
110+
viewPrevCommit();
111+
event.stopPropagation();
112+
break;
113+
case 'ArrowUp':
114+
viewNextCommit();
115+
event.stopPropagation();
116+
break;
117+
default:
118+
break;
119+
}
120+
};
121+
122+
const input = (
123+
<input
124+
className={styles.Input}
125+
type="text"
126+
inputMode="numeric"
127+
pattern="[0-9]*"
128+
value={selectedFilteredCommitIndex + 1}
129+
size={`${numFilteredCommits}`.length}
130+
onChange={handleCommitInputChange}
131+
onClick={handleClick}
132+
onKeyDown={handleKeyDown}
133+
/>
134+
);
135+
136+
label = (
137+
<Fragment>
138+
{input} / {numFilteredCommits}
139+
</Fragment>
140+
);
96141
}
97142

98-
const viewNextCommit = useCallback(() => {
143+
const viewNextCommit = () => {
99144
let nextCommitIndex = ((selectedFilteredCommitIndex: any): number) + 1;
100145
if (nextCommitIndex === filteredCommitIndices.length) {
101146
nextCommitIndex = 0;
102147
}
103148
selectCommitIndex(filteredCommitIndices[nextCommitIndex]);
104-
}, [selectedFilteredCommitIndex, filteredCommitIndices, selectCommitIndex]);
105-
const viewPrevCommit = useCallback(() => {
149+
};
150+
const viewPrevCommit = () => {
106151
let nextCommitIndex = ((selectedFilteredCommitIndex: any): number) - 1;
107152
if (nextCommitIndex < 0) {
108153
nextCommitIndex = filteredCommitIndices.length - 1;
109154
}
110155
selectCommitIndex(filteredCommitIndices[nextCommitIndex]);
111-
}, [selectedFilteredCommitIndex, filteredCommitIndices, selectCommitIndex]);
156+
};
112157

113-
const handleKeyDown = useCallback(
114-
event => {
115-
switch (event.key) {
116-
case 'ArrowLeft':
117-
viewPrevCommit();
118-
event.stopPropagation();
119-
break;
120-
case 'ArrowRight':
121-
viewNextCommit();
122-
event.stopPropagation();
123-
break;
124-
default:
125-
break;
126-
}
127-
},
128-
[viewNextCommit, viewPrevCommit],
129-
);
158+
const handleKeyDown = event => {
159+
switch (event.key) {
160+
case 'ArrowLeft':
161+
viewPrevCommit();
162+
event.stopPropagation();
163+
break;
164+
case 'ArrowRight':
165+
viewNextCommit();
166+
event.stopPropagation();
167+
break;
168+
default:
169+
break;
170+
}
171+
};
130172

131173
if (commitData.length === 0) {
132174
return null;

0 commit comments

Comments
 (0)