您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

useHandleEvents.ts 1.6KB

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