8
8
*/
9
9
10
10
import * as React from 'react' ;
11
- import { Fragment , useCallback , useContext , useMemo } from 'react' ;
11
+ import { Fragment , useCallback , useContext , useMemo , useRef } from 'react' ;
12
12
import Button from '../Button' ;
13
13
import ButtonIcon from '../ButtonIcon' ;
14
14
import { ProfilerContext } from './ProfilerContext' ;
@@ -31,6 +31,7 @@ export default function SnapshotSelector(_: Props) {
31
31
32
32
const { profilerStore} = useContext ( StoreContext ) ;
33
33
const { commitData} = profilerStore . getDataForRoot ( ( ( rootID : any ) : number ) ) ;
34
+ const selectedCommitInputRef = useRef ( ) ;
34
35
35
36
const totalDurations : Array < number > = [];
36
37
const commitTimes: Array< number > = [];
@@ -85,14 +86,63 @@ export default function SnapshotSelector(_: Props) {
85
86
}
86
87
87
88
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 ,
91
116
`${ 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
+ ) ;
96
146
}
97
147
98
148
const viewNextCommit = useCallback ( ( ) => {
0 commit comments