status-web/packages/status-react/src/hooks/useClickPosition.ts

33 lines
998 B
TypeScript
Raw Normal View History

import { useCallback, useEffect, useState } from 'react'
import type { RefObject } from 'react'
2022-01-28 14:08:19 +01:00
export const useClickPosition = (ref: RefObject<HTMLDivElement>) => {
const [topPosition, setTopPosition] = useState(0)
const [leftPosition, setLeftPosition] = useState(0)
2022-01-28 14:08:19 +01:00
const getPosition = useCallback(
(e: MouseEvent) => {
if (ref.current) {
const target = e.target as HTMLImageElement
const imgTarget = target.tagName === 'IMG'
const rect = ref.current.getBoundingClientRect()
const x = ref.current.clientWidth - e.clientX < 180 ? 180 : 0
setLeftPosition(imgTarget ? -200 : e.clientX - rect.left - x)
setTopPosition(imgTarget ? 0 : e.clientY - rect.top)
2022-01-28 14:08:19 +01:00
}
},
2022-02-03 08:57:05 +01:00
[setTopPosition, setLeftPosition, ref]
)
2022-01-28 14:08:19 +01:00
useEffect(() => {
document.addEventListener('contextmenu', getPosition)
2022-01-28 14:08:19 +01:00
return () => {
document.removeEventListener('contextmenu', getPosition)
}
})
2022-01-28 14:08:19 +01:00
return { topPosition, leftPosition }
}