useContextMenu.tsx 1.0 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import { useCallback, useEffect, useState } from 'react'
  2. export const useContextMenu = () => {
  3. const [position, setPosition] = useState({ x: 0, y: 0, left: true })
  4. const [isActive, setMenuActive] = useState(false)
  5. useEffect(() => {
  6. if (!isActive) {
  7. return
  8. }
  9. const closeContextMenu = () => setMenuActive(false)
  10. document.addEventListener('click', closeContextMenu, { once: true, capture: true })
  11. }, [isActive])
  12. const openContextMenu = useCallback((event: React.MouseEvent, menuWidth: number) => {
  13. const clickPositionFromRight = document.body.clientWidth - event.pageX
  14. if (clickPositionFromRight > menuWidth) {
  15. setPosition({ x: event.pageX, y: event.pageY, left: true })
  16. } else {
  17. setPosition({ x: clickPositionFromRight, y: event.pageY, left: false })
  18. }
  19. setMenuActive(true)
  20. }, [])
  21. const closeContextMenu = useCallback(() => {
  22. setMenuActive(false)
  23. }, [])
  24. const contextMenuOpts = {
  25. isActive,
  26. position,
  27. }
  28. return { openContextMenu, closeContextMenu, contextMenuOpts }
  29. }