From d61f36a0d21e92b32067293e572a8b2e36205665 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH] Added basic kb controls to tree Reviewed By: lawrencelomax Differential Revision: D41838171 fbshipit-source-id: 1e89c689b2c371f870b1a3f1c7dd8c611426195a --- .../public/ui-debugger/components/Tree2.tsx | 83 ++++++++++++++++++- 1 file changed, 81 insertions(+), 2 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index f3064ed04..a1d057296 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -37,7 +37,9 @@ export function Tree2({ const expandedNodes = useValue(instance.uiState.expandedNodes); const searchTerm = useValue(instance.uiState.searchTerm); - const items = toTreeList(nodes, rootId, expandedNodes); + const treeNodes = toTreeList(nodes, rootId, expandedNodes); + + useKeyboardShortcuts(treeNodes, selectedNode, onSelectNode); return ( { instance.uiState.hoveredNodes.set([]); }}> - {items.map((treeNode) => ( + {treeNodes.map((treeNode) => ( void, +) { + const instance = usePlugin(plugin); + + useEffect(() => { + const listener = (event: KeyboardEvent) => { + switch (event.key) { + case 'ArrowRight': { + event.preventDefault(); + + instance.uiState.expandedNodes.update((draft) => { + if (selectedNode) { + draft.add(selectedNode); + } + }); + + break; + } + case 'ArrowLeft': { + event.preventDefault(); + instance.uiState.expandedNodes.update((draft) => { + if (selectedNode) { + draft.delete(selectedNode); + } + }); + break; + } + + case 'ArrowDown': { + event.preventDefault(); + + const curIdx = treeNodes.findIndex( + (item) => item.id === head(instance.uiState.hoveredNodes.get()), + ); + if (curIdx != -1) { + const nextIdx = curIdx + 1; + if (nextIdx < treeNodes.length) { + const nextNode = treeNodes[nextIdx]; + instance.uiState.hoveredNodes.set([nextNode.id]); + } + } + break; + } + + case 'ArrowUp': { + event.preventDefault(); + + const curIdx = treeNodes.findIndex( + (item) => item.id === head(instance.uiState.hoveredNodes.get()), + ); + if (curIdx != -1) { + const prevIdx = curIdx - 1; + if (prevIdx >= 0) { + const prevNode = treeNodes[prevIdx]; + instance.uiState.hoveredNodes.set([prevNode.id]); + } + } + break; + } + } + }; + window.addEventListener('keydown', listener); + return () => { + window.removeEventListener('keydown', listener); + }; + }, [ + instance.uiState.expandedNodes, + treeNodes, + onSelectNode, + selectedNode, + instance.uiState.hoveredNodes, + ]); +}