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.

useCanvasEvents.ts 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { MutableRefObject, useCallback } from 'react'
  2. import state from 'state'
  3. import {
  4. fastBrushSelect,
  5. fastDrawUpdate,
  6. fastTransform,
  7. fastTranslate,
  8. } from 'state/hacks'
  9. import inputs from 'state/inputs'
  10. import { isMobile } from 'utils/utils'
  11. export default function useCanvasEvents(
  12. rCanvas: MutableRefObject<SVGGElement>
  13. ) {
  14. const handlePointerDown = useCallback((e: React.PointerEvent) => {
  15. if (!inputs.canAccept(e.pointerId)) return
  16. rCanvas.current.setPointerCapture(e.pointerId)
  17. if (e.button === 0) {
  18. state.send('POINTED_CANVAS', inputs.pointerDown(e, 'canvas'))
  19. } else if (e.button === 2) {
  20. state.send('RIGHT_POINTED', inputs.pointerDown(e, 'canvas'))
  21. }
  22. }, [])
  23. const handleTouchStart = useCallback((e: React.TouchEvent) => {
  24. if (isMobile()) {
  25. if (e.touches.length === 2) {
  26. state.send('TOUCH_UNDO')
  27. } else state.send('TOUCHED_CANVAS')
  28. }
  29. }, [])
  30. const handlePointerMove = useCallback((e: React.PointerEvent) => {
  31. if (!inputs.canAccept(e.pointerId)) return
  32. const info = inputs.pointerMove(e)
  33. if (state.isIn('draw.editing')) {
  34. fastDrawUpdate(info)
  35. return
  36. }
  37. if (state.isIn('brushSelecting')) {
  38. fastBrushSelect(info.point)
  39. return
  40. }
  41. if (state.isIn('translatingSelection')) {
  42. fastTranslate(info)
  43. return
  44. }
  45. if (state.isIn('transformingSelection')) {
  46. fastTransform(info)
  47. return
  48. }
  49. state.send('MOVED_POINTER', info)
  50. }, [])
  51. const handlePointerUp = useCallback((e: React.PointerEvent) => {
  52. if (!inputs.canAccept(e.pointerId)) return
  53. rCanvas.current.releasePointerCapture(e.pointerId)
  54. state.send('STOPPED_POINTING', { id: 'canvas', ...inputs.pointerUp(e) })
  55. }, [])
  56. return {
  57. onPointerDown: handlePointerDown,
  58. onTouchStart: handleTouchStart,
  59. onPointerMove: handlePointerMove,
  60. onPointerUp: handlePointerUp,
  61. }
  62. }