1234567891011121314151617181920212223242526272829303132333435 |
- import { useCallback, useEffect, useState } from 'react'
- export const useContextMenu = () => {
- const [position, setPosition] = useState({ x: 0, y: 0, left: true })
- const [isActive, setMenuActive] = useState(false)
- useEffect(() => {
- if (!isActive) {
- return
- }
- const closeContextMenu = () => setMenuActive(false)
- document.addEventListener('click', closeContextMenu, { once: true, capture: true })
- }, [isActive])
- const openContextMenu = useCallback((event: React.MouseEvent, menuWidth: number) => {
- const clickPositionFromRight = document.body.clientWidth - event.pageX
- if (clickPositionFromRight > menuWidth) {
- setPosition({ x: event.pageX, y: event.pageY, left: true })
- } else {
- setPosition({ x: clickPositionFromRight, y: event.pageY, left: false })
- }
- setMenuActive(true)
- }, [])
- const closeContextMenu = useCallback(() => {
- setMenuActive(false)
- }, [])
- const contextMenuOpts = {
- isActive,
- position,
- }
- return { openContextMenu, closeContextMenu, contextMenuOpts }
- }
|