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 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
  2. import { MutableRefObject, useCallback } from 'react'
  3. import state from 'state'
  4. import {
  5. fastBrushSelect,
  6. fastDrawUpdate,
  7. fastTransform,
  8. fastTranslate,
  9. } from 'state/hacks'
  10. import inputs from 'state/inputs'
  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 handlePointerMove = useCallback((e: React.PointerEvent) => {
  24. if (!inputs.canAccept(e.pointerId)) return
  25. const info = inputs.pointerMove(e)
  26. if (state.isIn('draw.editing')) {
  27. fastDrawUpdate(info)
  28. return
  29. }
  30. if (state.isIn('brushSelecting')) {
  31. fastBrushSelect(info.point)
  32. return
  33. }
  34. if (state.isIn('translatingSelection')) {
  35. fastTranslate(info)
  36. return
  37. }
  38. if (state.isIn('transformingSelection')) {
  39. fastTransform(info)
  40. return
  41. }
  42. state.send('MOVED_POINTER', info)
  43. }, [])
  44. const handlePointerUp = useCallback((e: React.PointerEvent) => {
  45. if (!inputs.canAccept(e.pointerId)) return
  46. e.stopPropagation()
  47. rCanvas.current.releasePointerCapture(e.pointerId)
  48. state.send('STOPPED_POINTING', {
  49. id: 'canvas',
  50. ...inputs.pointerUp(e, 'canvas'),
  51. })
  52. }, [])
  53. const handleTouchStart = useCallback(() => {
  54. // if (isMobile()) {
  55. // if (e.touches.length === 2) {
  56. // state.send('TOUCH_UNDO')
  57. // } else state.send('TOUCHED_CANVAS')
  58. // }
  59. }, [])
  60. return {
  61. onPointerDown: handlePointerDown,
  62. onPointerMove: handlePointerMove,
  63. onPointerUp: handlePointerUp,
  64. onTouchStart: handleTouchStart,
  65. }
  66. }