Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

useCanvasEvents.ts 1.6KB

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