2022-02-24 22:58:50 +01:00
|
|
|
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>) => {
|
2022-02-23 15:49:00 +01:00
|
|
|
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) {
|
2022-02-23 15:49:00 +01:00
|
|
|
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-02-23 15:49:00 +01:00
|
|
|
)
|
2022-01-28 14:08:19 +01:00
|
|
|
|
|
|
|
useEffect(() => {
|
2022-02-23 15:49:00 +01:00
|
|
|
document.addEventListener('contextmenu', getPosition)
|
2022-01-28 14:08:19 +01:00
|
|
|
|
|
|
|
return () => {
|
2022-02-23 15:49:00 +01:00
|
|
|
document.removeEventListener('contextmenu', getPosition)
|
|
|
|
}
|
|
|
|
})
|
2022-01-28 14:08:19 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
return { topPosition, leftPosition }
|
|
|
|
}
|