diff --git a/src/assets/right-arrow.svg b/src/assets/right-arrow.svg new file mode 100644 index 0000000..400f9cb --- /dev/null +++ b/src/assets/right-arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/shared/ContextMenu.tsx b/src/components/shared/ContextMenu.tsx new file mode 100644 index 0000000..fb12e44 --- /dev/null +++ b/src/components/shared/ContextMenu.tsx @@ -0,0 +1,116 @@ +import { Dispatch, SetStateAction, useRef, useState } from 'react' +import RightArrow from '../../assets/right-arrow.svg' + +function Item({ + name, + isDropdown, + isWarning, + onClick, + children, +}: { + name: string + isDropdown?: boolean + isWarning?: boolean + onClick?: () => void + children?: React.ReactNode +}) { + return ( +
+
+ {name} +
+ {isDropdown && ( +
+ dropdown btn +
+ )} + {children} +
+ ) +} + +function SubMenu({ + name, + list, + openSubMenu, + setOpenSubMenu, +}: { + name: string + list: string[] + openSubMenu: string | null + setOpenSubMenu: Dispatch> +}) { + const timeoutRef = useRef(null) + + const handleMouseEnter = () => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current) + } + setOpenSubMenu(name) + } + + const handleMouseLeave = () => { + timeoutRef.current = setTimeout(() => { + setOpenSubMenu((prevOpenSubMenu: string | null) => { + return prevOpenSubMenu === name ? null : prevOpenSubMenu + }) + }, 300) + } + + return ( +
+ + + {openSubMenu === name && ( +
+ {list.map((item, index) => ( + + ))} +
+ )} +
+ ) +} + +export default function ContextMenu() { + const [openSubMenu, setOpenSubMenu] = useState(null) + + return ( +
+ + + + + +
+ + + + + +
+ +
+ ) +}