Skip to content

Commit 6c43a62

Browse files
ChrisDobbybvaughn
andauthored
DevTools: Switch between "Rendered At" renders using keyboard arrow keys (facebook#18586)
* Add keyboard navigation to fibre info sidebar Co-authored-by: Brian Vaughn <brian.david.vaughn@gmail.com>
1 parent 0c3c27a commit 6c43a62

File tree

1 file changed

+39
-2
lines changed

1 file changed

+39
-2
lines changed

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

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

1010
import * as React from 'react';
11-
import {Fragment, useContext} from 'react';
11+
import {Fragment, useContext, useEffect, useRef} from 'react';
1212
import WhatChanged from './WhatChanged';
1313
import {ProfilerContext} from './ProfilerContext';
1414
import {formatDuration, formatTime} from './utils';
@@ -31,12 +31,48 @@ export default function SidebarSelectedFiberInfo(_: Props) {
3131
selectFiber,
3232
} = useContext(ProfilerContext);
3333
const {profilingCache} = profilerStore;
34+
const selectedListItemRef = useRef<HTMLElement | null>(null);
3435

3536
const commitIndices = profilingCache.getFiberCommits({
3637
fiberID: ((selectedFiberID: any): number),
3738
rootID: ((rootID: any): number),
3839
});
3940

41+
const handleKeyDown = event => {
42+
switch (event.key) {
43+
case 'ArrowUp':
44+
if (selectedCommitIndex !== null) {
45+
const prevIndex = commitIndices.indexOf(selectedCommitIndex);
46+
const nextIndex =
47+
prevIndex > 0 ? prevIndex - 1 : commitIndices.length - 1;
48+
selectCommitIndex(commitIndices[nextIndex]);
49+
}
50+
event.preventDefault();
51+
break;
52+
case 'ArrowDown':
53+
if (selectedCommitIndex !== null) {
54+
const prevIndex = commitIndices.indexOf(selectedCommitIndex);
55+
const nextIndex =
56+
prevIndex < commitIndices.length - 1 ? prevIndex + 1 : 0;
57+
selectCommitIndex(commitIndices[nextIndex]);
58+
}
59+
event.preventDefault();
60+
break;
61+
default:
62+
break;
63+
}
64+
};
65+
66+
useEffect(() => {
67+
const selectedElement = selectedListItemRef.current;
68+
if (
69+
selectedElement !== null &&
70+
typeof selectedElement.scrollIntoView === 'function'
71+
) {
72+
selectedElement.scrollIntoView({block: 'nearest', inline: 'nearest'});
73+
}
74+
}, [selectedCommitIndex]);
75+
4076
const listItems = [];
4177
let i = 0;
4278
for (i = 0; i < commitIndices.length; i++) {
@@ -50,6 +86,7 @@ export default function SidebarSelectedFiberInfo(_: Props) {
5086
listItems.push(
5187
<button
5288
key={commitIndex}
89+
ref={selectedCommitIndex === commitIndex ? selectedListItemRef : null}
5390
className={
5491
selectedCommitIndex === commitIndex
5592
? styles.CurrentCommit
@@ -75,7 +112,7 @@ export default function SidebarSelectedFiberInfo(_: Props) {
75112
<ButtonIcon type="close" />
76113
</Button>
77114
</div>
78-
<div className={styles.Content}>
115+
<div className={styles.Content} onKeyDown={handleKeyDown} tabIndex={0}>
79116
<WhatChanged fiberID={((selectedFiberID: any): number)} />
80117
{listItems.length > 0 && (
81118
<Fragment>

0 commit comments

Comments
 (0)