88 */
99
1010import * as React from 'react' ;
11- import { Fragment , useCallback , useContext , useMemo } from 'react' ;
11+ import { Fragment , useCallback , useContext , useMemo , useRef } from 'react' ;
1212import Button from '../Button' ;
1313import ButtonIcon from '../ButtonIcon' ;
1414import { 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