選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

page.tsx 1.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { useSelector } from 'state'
  2. import { ShapeTreeNode } from 'types'
  3. import ShapeComponent from './shape'
  4. export default function Page(): JSX.Element {
  5. const shapesToRender = useSelector((s) => s.values.shapesToRender)
  6. const allowHovers = useSelector((s) =>
  7. s.isInAny('selecting', 'text', 'editingShape')
  8. )
  9. return (
  10. <>
  11. {shapesToRender.map((node) => (
  12. <ShapeNode key={node.shape.id} node={node} allowHovers={allowHovers} />
  13. ))}
  14. </>
  15. )
  16. }
  17. interface ShapeNodeProps {
  18. node: ShapeTreeNode
  19. allowHovers: boolean
  20. }
  21. const ShapeNode = ({
  22. node: {
  23. shape,
  24. children,
  25. isEditing,
  26. isHovered,
  27. isDarkMode,
  28. isSelected,
  29. isCurrentParent,
  30. },
  31. allowHovers,
  32. }: ShapeNodeProps) => {
  33. return (
  34. <>
  35. <ShapeComponent
  36. shape={shape}
  37. isEditing={isEditing}
  38. isHovered={allowHovers && isHovered}
  39. isSelected={isSelected}
  40. isDarkMode={isDarkMode}
  41. isCurrentParent={isCurrentParent}
  42. />
  43. {children.map((childNode) => (
  44. <ShapeNode
  45. key={childNode.shape.id}
  46. node={childNode}
  47. allowHovers={allowHovers}
  48. />
  49. ))}
  50. </>
  51. )
  52. }