From fe2cd9be6b0b600db2ccb8c61fdcdac350dad2c8 Mon Sep 17 00:00:00 2001 From: maxichrome Date: Sat, 28 May 2022 05:37:52 -0500 Subject: [PATCH] refactor context menu data structure --- .../src/components/layout/MenuOverlay.tsx | 4 +- packages/ui/src/ContextMenu.stories.tsx | 46 ++++++------- packages/ui/src/ContextMenu.tsx | 65 ++++++++++--------- 3 files changed, 57 insertions(+), 58 deletions(-) diff --git a/packages/interface/src/components/layout/MenuOverlay.tsx b/packages/interface/src/components/layout/MenuOverlay.tsx index 786f815e3..2d4970ffe 100644 --- a/packages/interface/src/components/layout/MenuOverlay.tsx +++ b/packages/interface/src/components/layout/MenuOverlay.tsx @@ -29,7 +29,7 @@ export const MenuContext = React.createContext React.useContext(MenuContext); export const WithContextMenu: React.FC<{ - menu: ContextMenuProps['sections']; + menu: ContextMenuProps['items']; children: React.ReactElement<{ onContextMenu: MouseEventHandler }>; }> = (props) => { const { menu: sections = [], children } = props; @@ -45,7 +45,7 @@ export const WithContextMenu: React.FC<{ e.stopPropagation(); menu.showMenu( - , + , { x: e.clientX, y: e.clientY }, e.target as HTMLElement ); diff --git a/packages/ui/src/ContextMenu.stories.tsx b/packages/ui/src/ContextMenu.stories.tsx index 364ed372e..9920e941b 100644 --- a/packages/ui/src/ContextMenu.stories.tsx +++ b/packages/ui/src/ContextMenu.stories.tsx @@ -16,30 +16,26 @@ const Template: ComponentStory = (args) => {} - } - ] - }, - { - items: [ - { - label: 'View Info', - icon: FileText, - onClick: () => {} - }, - { - label: 'Delete', - icon: Trash, - danger: true, - onClick: () => {} - } - ] - } + items: [ + [ + { + label: 'New Item', + icon: Plus, + onClick: () => {} + } + ], + [ + { + label: 'View Info', + icon: FileText, + onClick: () => {} + }, + { + label: 'Delete', + icon: Trash, + danger: true, + onClick: () => {} + } + ] ] }; diff --git a/packages/ui/src/ContextMenu.tsx b/packages/ui/src/ContextMenu.tsx index 0c261edf9..35774eee4 100644 --- a/packages/ui/src/ContextMenu.tsx +++ b/packages/ui/src/ContextMenu.tsx @@ -11,56 +11,59 @@ export interface ContextMenuItem { } export interface ContextMenuProps { - sections?: { - heading?: string; - items: ContextMenuItem[]; - }[]; + items?: (ContextMenuItem | string)[][]; className?: string; } export const ContextMenu: React.FC = (props) => { - const { sections = [], className, ...rest } = props; + const { items = [], className, ...rest } = props; return (
- {sections.map((sec, i) => ( + {items.map((sec, i) => ( <> {i !== 0 && ( -
+
)}
- {sec.heading && ( - {sec.heading} - )} -
    - {sec.items.map(({ icon: ItemIcon = Question, ...item }) => ( -
  • - -
  • - ))} + {sec.map((item) => { + if (typeof item === 'string') + return {item}; + + const { icon: ItemIcon = Question } = item; + + return ( +
  • + +
  • + ); + })}