diff options
author | crupest <crupest@outlook.com> | 2023-07-31 17:15:53 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2023-07-31 17:15:53 +0800 |
commit | f0f1984405db795d5a60bd03d05bec524dc12db3 (patch) | |
tree | d84d06ca188ff91987177fc4477c9045eaa73cc1 /FrontEnd/src/views/common/menu/PopupMenu.tsx | |
parent | d9c1d512fa64ef4f8c08ca34f7a5842642879bcc (diff) | |
download | timeline-f0f1984405db795d5a60bd03d05bec524dc12db3.tar.gz timeline-f0f1984405db795d5a60bd03d05bec524dc12db3.tar.bz2 timeline-f0f1984405db795d5a60bd03d05bec524dc12db3.zip |
...
Diffstat (limited to 'FrontEnd/src/views/common/menu/PopupMenu.tsx')
-rw-r--r-- | FrontEnd/src/views/common/menu/PopupMenu.tsx | 82 |
1 files changed, 39 insertions, 43 deletions
diff --git a/FrontEnd/src/views/common/menu/PopupMenu.tsx b/FrontEnd/src/views/common/menu/PopupMenu.tsx index 74ca7aba..7ac12755 100644 --- a/FrontEnd/src/views/common/menu/PopupMenu.tsx +++ b/FrontEnd/src/views/common/menu/PopupMenu.tsx @@ -1,5 +1,5 @@ +import { useState, CSSProperties, ReactNode } from "react"; import classNames from "classnames"; -import * as React from "react"; import { createPortal } from "react-dom"; import { usePopper } from "react-popper"; @@ -11,61 +11,57 @@ import "./PopupMenu.css"; export interface PopupMenuProps { items: MenuItems; - children?: React.ReactNode; + children?: ReactNode; containerClassName?: string; - containerStyle?: React.CSSProperties; + containerStyle?: CSSProperties; } -const PopupMenu: React.FC<PopupMenuProps> = ({ +export default function PopupMenu({ items, children, containerClassName, containerStyle, -}) => { - const [show, setShow] = React.useState<boolean>(false); +}: PopupMenuProps) { + const [show, setShow] = useState<boolean>(false); const [referenceElement, setReferenceElement] = - React.useState<HTMLDivElement | null>(null); - const [popperElement, setPopperElement] = - React.useState<HTMLDivElement | null>(null); + useState<HTMLDivElement | null>(null); + const [popperElement, setPopperElement] = useState<HTMLDivElement | null>( + null, + ); const { styles, attributes } = usePopper(referenceElement, popperElement); useClickOutside(popperElement, () => setShow(false), true); return ( - <> - <div - ref={setReferenceElement} - className={classNames( - "cru-popup-menu-trigger-container", - containerClassName + <div + ref={setReferenceElement} + className={classNames( + "cru-popup-menu-trigger-container", + containerClassName, + )} + style={containerStyle} + onClick={() => setShow(true)} + > + {children} + {show && + createPortal( + <div + ref={setPopperElement} + className="cru-popup-menu-menu-container" + style={styles.popper} + {...attributes.popper} + > + <Menu + items={items} + onItemClicked={() => { + setShow(false); + }} + /> + </div>, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + document.getElementById("portal")!, )} - style={containerStyle} - onClick={() => setShow(true)} - > - {children} - </div> - {show - ? createPortal( - <div - ref={setPopperElement} - className="cru-popup-menu-menu-container" - style={styles.popper} - {...attributes.popper} - > - <Menu - items={items} - onItemClicked={() => { - setShow(false); - }} - /> - </div>, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - document.getElementById("portal")! - ) - : null} - </> + </div> ); -}; - -export default PopupMenu; +} |