ObjectNode.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import React from "react";
  2. // import { useInViewport } from "react-in-viewport";
  3. import { CustomNodeProps } from "src/components/CustomNode";
  4. import useConfig from "src/store/useConfig";
  5. import * as Styled from "./styles";
  6. const inViewport = true;
  7. const ObjectNode: React.FC<CustomNodeProps> = ({ node, x, y }) => {
  8. const { text, width, height, data } = node;
  9. const ref = React.useRef(null);
  10. const performanceMode = useConfig(state => state.performanceMode);
  11. // const { inViewport } = useInViewport(ref);
  12. if (data.isEmpty) return null;
  13. return (
  14. <Styled.StyledForeignObject
  15. width={width}
  16. height={height}
  17. x={0}
  18. y={0}
  19. ref={ref}
  20. isObject
  21. >
  22. {(!performanceMode || inViewport) &&
  23. text.map((val, idx) => (
  24. <Styled.StyledRow
  25. data-key={JSON.stringify(val[1])}
  26. data-x={x}
  27. data-y={y}
  28. key={idx}
  29. >
  30. <Styled.StyledKey objectKey>
  31. {JSON.stringify(val[0]).replaceAll('"', "")}:{" "}
  32. </Styled.StyledKey>
  33. <Styled.StyledLinkItUrl>{JSON.stringify(val[1])}</Styled.StyledLinkItUrl>
  34. </Styled.StyledRow>
  35. ))}
  36. </Styled.StyledForeignObject>
  37. );
  38. };
  39. function propsAreEqual(prev: CustomNodeProps, next: CustomNodeProps) {
  40. return (
  41. String(prev.node.text) === String(next.node.text) &&
  42. prev.node.width === next.node.width
  43. );
  44. }
  45. export default React.memo(ObjectNode, propsAreEqual);