You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

useShapeEvents.ts 1.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { MutableRefObject, useCallback } from 'react'
  2. import state from 'state'
  3. import inputs from 'state/inputs'
  4. export default function useShapeEvents(
  5. id: string,
  6. rGroup: MutableRefObject<SVGElement>
  7. ) {
  8. const handlePointerDown = useCallback(
  9. (e: React.PointerEvent) => {
  10. if (!inputs.canAccept(e.pointerId)) return
  11. // e.stopPropagation()
  12. rGroup.current.setPointerCapture(e.pointerId)
  13. state.send('POINTED_SHAPE', inputs.pointerDown(e, id))
  14. },
  15. [id]
  16. )
  17. const handlePointerUp = useCallback(
  18. (e: React.PointerEvent) => {
  19. if (!inputs.canAccept(e.pointerId)) return
  20. // e.stopPropagation()
  21. rGroup.current.releasePointerCapture(e.pointerId)
  22. state.send('STOPPED_POINTING', inputs.pointerUp(e))
  23. },
  24. [id]
  25. )
  26. const handlePointerEnter = useCallback(
  27. (e: React.PointerEvent) => {
  28. if (!inputs.canAccept(e.pointerId)) return
  29. state.send('HOVERED_SHAPE', inputs.pointerEnter(e, id))
  30. },
  31. [id]
  32. )
  33. const handlePointerMove = useCallback(
  34. (e: React.PointerEvent) => {
  35. if (!inputs.canAccept(e.pointerId)) return
  36. state.send('MOVED_OVER_SHAPE', inputs.pointerEnter(e, id))
  37. },
  38. [id]
  39. )
  40. const handlePointerLeave = useCallback(
  41. (e: React.PointerEvent) => {
  42. if (!inputs.canAccept(e.pointerId)) return
  43. state.send('UNHOVERED_SHAPE', { target: id })
  44. },
  45. [id]
  46. )
  47. return {
  48. onPointerDown: handlePointerDown,
  49. onPointerUp: handlePointerUp,
  50. onPointerEnter: handlePointerEnter,
  51. onPointerMove: handlePointerMove,
  52. onPointerLeave: handlePointerLeave,
  53. }
  54. }