Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

useShapeEvents.ts 2.1KB

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