ObjectNode.tsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import React from "react";
  2. // import { useInViewport } from "react-in-viewport";
  3. import { CustomNodeProps } from "src/components/CustomNode";
  4. import useGraph from "src/store/useGraph";
  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 = useGraph(state => state.performanceMode);
  11. // const { inViewport } = useInViewport(ref);
  12. if (data.isEmpty) return null;
  13. return (
  14. <Styled.StyledForeignObject width={width} height={height} x={0} y={0} ref={ref} isObject>
  15. {(!performanceMode || inViewport) &&
  16. text.map((val, idx) => (
  17. <Styled.StyledRow data-key={JSON.stringify(val[1])} data-x={x} data-y={y} key={idx}>
  18. <Styled.StyledKey objectKey>
  19. {JSON.stringify(val[0]).replaceAll('"', "")}:{" "}
  20. </Styled.StyledKey>
  21. <Styled.StyledLinkItUrl>{JSON.stringify(val[1])}</Styled.StyledLinkItUrl>
  22. </Styled.StyledRow>
  23. ))}
  24. </Styled.StyledForeignObject>
  25. );
  26. };
  27. function propsAreEqual(prev: CustomNodeProps, next: CustomNodeProps) {
  28. return String(prev.node.text) === String(next.node.text) && prev.node.width === next.node.width;
  29. }
  30. export default React.memo(ObjectNode, propsAreEqual);