From ed35623bef10e7af4200439166d3f47bc2fbfe07 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH] Only render a single context menu for the entire tree Summary: There is no reason to have a context menu rendered by react for each item in the tree, its pretty wastefull. It also means less props drilled to the tree node Reviewed By: lblasa Differential Revision: D41872778 fbshipit-source-id: b13491a310c03334d7f3056207f5de23d20c3e61 --- .../public/ui-debugger/components/Tree2.tsx | 132 ++++++++---------- 1 file changed, 60 insertions(+), 72 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index f9f49da13..33b8d7b33 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -83,31 +83,35 @@ export function Tree2({ -
{ - if (isContextMenuOpen === false) { - instance.uiState.hoveredNodes.set([]); - } - }}> - {treeNodes.map((treeNode, index) => ( - - ))} -
+ +
{ + if (isContextMenuOpen === false) { + instance.uiState.hoveredNodes.set([]); + } + }}> + {treeNodes.map((treeNode, index) => ( + + ))} +
+
); } @@ -138,11 +142,8 @@ function TreeItemContainer({ treeNode, selectedNode, hoveredNode, - focusedNode, isUsingKBToScroll, isContextMenuOpen, - onFocusNode, - onContextMenuOpen, onSelectNode, onExpandNode, onCollapseNode, @@ -152,55 +153,42 @@ function TreeItemContainer({ treeNode: TreeNode; selectedNode?: Id; hoveredNode?: Id; - focusedNode?: Id; isUsingKBToScroll: RefObject; isContextMenuOpen: boolean; - onFocusNode: (id?: Id) => void; - onContextMenuOpen: (open: boolean) => void; onSelectNode: (node?: Id) => void; onExpandNode: (node: Id) => void; onCollapseNode: (node: Id) => void; onHoverNode: (node: Id) => void; }) { return ( - - { - if ( - isUsingKBToScroll.current === false && - isContextMenuOpen == false - ) { - onHoverNode(treeNode.id); + { + if (isUsingKBToScroll.current === false && isContextMenuOpen == false) { + onHoverNode(treeNode.id); + } + }} + onClick={() => { + onSelectNode(treeNode.id); + }} + item={treeNode}> + 0} + onClick={() => { + if (treeNode.isExpanded) { + onCollapseNode(treeNode.id); + } else { + onExpandNode(treeNode.id); } }} - onClick={() => { - onSelectNode(treeNode.id); - }} - item={treeNode}> - 0} - onClick={() => { - if (treeNode.isExpanded) { - onCollapseNode(treeNode.id); - } else { - onExpandNode(treeNode.id); - } - }} - /> - {nodeIcon(treeNode)} - - - - + /> + {nodeIcon(treeNode)} + + + ); } @@ -291,13 +279,13 @@ const DecorationImage = styled.img({ const renderDepthOffset = 4; const ContextMenu: React.FC<{ - node: TreeNode; + nodes: Map; hoveredNode?: Id; focusedNode?: Id; onFocusNode: (id?: Id) => void; onContextMenuOpen: (open: boolean) => void; }> = ({ - node, + nodes, hoveredNode, children, focusedNode, @@ -311,12 +299,12 @@ const ContextMenu: React.FC<{ }} overlay={() => ( - {focusedNode !== hoveredNode && ( + {hoveredNode != null && focusedNode !== hoveredNode && ( { - onFocusNode(node.id); + onFocusNode(hoveredNode); }} /> )}