import React, { JSX, useMemo } from 'react'; import { Background, ColorMode, Controls, ReactFlow } from '@xyflow/react'; import styled from 'styled-components'; import { BffCatalogEntity } from '@redocly/theme/core/types'; import { useColorSwitcher, useThemeHooks } from '@redocly/theme/core/hooks'; import { useGraph } from '@redocly/theme/core/hooks'; import { CatalogEntityRelationsNode } from '@redocly/theme/components/Catalog/CatalogEntity/CatalogEntityGraph/CatalogEntityRelationsNode'; import { CatalogEntityRelationsEdge } from '@redocly/theme/components/Catalog/CatalogEntity/CatalogEntityGraph/CatalogEntityRelationsEdge'; import { xyflow } from '@redocly/theme/core/styles'; import { CatalogPageDescription } from '@redocly/theme/components/Catalog/CatalogPageDescription'; import { GraphCustomEdgeType, GraphCustomNodeType } from '@redocly/theme/core/constants/catalog'; export type CatalogEntityRelationsGraphProps = { entity: BffCatalogEntity; }; const commonReactFlowConfig = { fitView: true, proOptions: { hideAttribution: true, }, style: { border: 'var(--catalog-card-border-width) var(--catalog-card-border-style) var(--catalog-card-border-color)', borderRadius: 'var(--catalog-card-border-radius, 8px)', }, }; export function CatalogEntityRelationsGraph({ entity, }: CatalogEntityRelationsGraphProps): JSX.Element { const { useFetchCatalogEntitiesRelations } = useThemeHooks(); const { activeColorMode } = useColorSwitcher(); const combinedFilter = useMemo(() => { if (entity.version && entity.revision) { const versionFilter = `version:"${entity.version}"`; const revisionFilter = `revision:"${entity.revision}"`; return `${versionFilter} AND ${revisionFilter}`; } return undefined; }, [entity.version, entity.revision]); const { items: allRelations } = useFetchCatalogEntitiesRelations({ entityKey: entity.key, filter: combinedFilter, }); const { nodes, edges, onNodesChange, onEdgesChange, onConnect } = useGraph({ entity, relations: allRelations ?? [], }); const nodeTypes = useMemo( () => ({ [GraphCustomNodeType.CatalogEntity]: CatalogEntityRelationsNode }), [], ); const edgeTypes = useMemo( () => ({ [GraphCustomEdgeType.CatalogEdge]: CatalogEntityRelationsEdge }), [], ); const reactFlowConfig = allRelations.length ? { key: entity.id, nodes, edges, nodeTypes, edgeTypes, onNodesChange, onEdgesChange, onConnect, colorMode: activeColorMode as ColorMode, ...commonReactFlowConfig, } : { ...commonReactFlowConfig, }; return ( <> ); } const GraphWrapper = styled.div` height: 700px; width: 100%; ${xyflow} `;