Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

shape-g.tsx 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import state, { useSelector } from "state"
  2. import React, { useCallback, useRef } from "react"
  3. import { getPointerEventInfo } from "utils/utils"
  4. import { Indicator, HoverIndicator } from "./indicator"
  5. import styled from "styles"
  6. export default function ShapeGroup({
  7. id,
  8. children,
  9. point,
  10. }: {
  11. id: string
  12. children: React.ReactNode
  13. point: number[]
  14. }) {
  15. const rGroup = useRef<SVGGElement>(null)
  16. const isSelected = useSelector((state) => state.values.selectedIds.has(id))
  17. const handlePointerDown = useCallback(
  18. (e: React.PointerEvent) => {
  19. e.stopPropagation()
  20. rGroup.current.setPointerCapture(e.pointerId)
  21. state.send("POINTED_SHAPE", { id, ...getPointerEventInfo(e) })
  22. },
  23. [id]
  24. )
  25. const handlePointerUp = useCallback(
  26. (e: React.PointerEvent) => {
  27. e.stopPropagation()
  28. rGroup.current.releasePointerCapture(e.pointerId)
  29. state.send("STOPPED_POINTING_SHAPE", { id, ...getPointerEventInfo(e) })
  30. },
  31. [id]
  32. )
  33. const handlePointerEnter = useCallback(
  34. (e: React.PointerEvent) =>
  35. state.send("HOVERED_SHAPE", { id, ...getPointerEventInfo(e) }),
  36. [id]
  37. )
  38. const handlePointerLeave = useCallback(
  39. (e: React.PointerEvent) =>
  40. state.send("UNHOVERED_SHAPE", { id, ...getPointerEventInfo(e) }),
  41. [id]
  42. )
  43. return (
  44. <StyledGroup
  45. ref={rGroup}
  46. isSelected={isSelected}
  47. transform={`translate(${point})`}
  48. onPointerDown={handlePointerDown}
  49. onPointerUp={handlePointerUp}
  50. onPointerEnter={handlePointerEnter}
  51. onPointerLeave={handlePointerLeave}
  52. >
  53. {children}
  54. </StyledGroup>
  55. )
  56. }
  57. const StyledGroup = styled("g", {
  58. [`& ${HoverIndicator}`]: {
  59. opacity: "0",
  60. },
  61. variants: {
  62. isSelected: {
  63. true: {
  64. [`& ${Indicator}`]: {
  65. stroke: "$selected",
  66. },
  67. [`&:hover ${HoverIndicator}`]: {
  68. opacity: "1",
  69. stroke: "$hint",
  70. },
  71. },
  72. false: {
  73. [`&:hover ${HoverIndicator}`]: {
  74. opacity: "1",
  75. stroke: "$hint",
  76. },
  77. },
  78. },
  79. },
  80. })