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.

shape-g.tsx 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import state from "state"
  2. import React, { useCallback, useRef } from "react"
  3. import { getPointerEventInfo } from "utils/utils"
  4. export default function ShapeGroup({
  5. id,
  6. children,
  7. point,
  8. }: {
  9. id: string
  10. children: React.ReactNode
  11. point: number[]
  12. }) {
  13. const rGroup = useRef<SVGGElement>(null)
  14. const handlePointerDown = useCallback(
  15. (e: React.PointerEvent) => {
  16. e.stopPropagation()
  17. rGroup.current.setPointerCapture(e.pointerId)
  18. state.send("POINTED_SHAPE", { id, ...getPointerEventInfo(e) })
  19. },
  20. [id]
  21. )
  22. const handlePointerUp = useCallback(
  23. (e: React.PointerEvent) => {
  24. e.stopPropagation()
  25. rGroup.current.releasePointerCapture(e.pointerId)
  26. state.send("STOPPED_POINTING_SHAPE", { id, ...getPointerEventInfo(e) })
  27. },
  28. [id]
  29. )
  30. const handlePointerEnter = useCallback(
  31. (e: React.PointerEvent) =>
  32. state.send("HOVERED_SHAPE", { id, ...getPointerEventInfo(e) }),
  33. [id]
  34. )
  35. const handlePointerLeave = useCallback(
  36. (e: React.PointerEvent) =>
  37. state.send("UNHOVERED_SHAPE", { id, ...getPointerEventInfo(e) }),
  38. [id]
  39. )
  40. return (
  41. <g
  42. ref={rGroup}
  43. transform={`translate(${point})`}
  44. onPointerDown={handlePointerDown}
  45. onPointerUp={handlePointerUp}
  46. onPointerEnter={handlePointerEnter}
  47. onPointerLeave={handlePointerLeave}
  48. >
  49. {children}
  50. </g>
  51. )
  52. }