import { ProvidedZoom, TransformMatrix } from '@visx/zoom/lib/types'; import React, { SVGProps, useEffect, useMemo, useState } from 'react'; import styled from 'styled-components/macro'; import LineageTree from '@app/lineage/LineageTree'; import { Direction, EntityAndType, EntitySelectParams, FetchedEntity, UpdatedLineages } from '@app/lineage/types'; import constructTree from '@app/lineage/utils/constructTree'; import { useEntityRegistry } from '@app/useEntityRegistry'; type Props = { margin: { top: number; right: number; bottom: number; left: number }; entityAndType?: EntityAndType | null; fetchedEntities: Map; onEntityClick: (EntitySelectParams) => void; onEntityCenter: (EntitySelectParams) => void; onLineageExpand: (data: EntityAndType) => void; selectedEntity?: EntitySelectParams; zoom: ProvidedZoom & { transformMatrix: TransformMatrix; isDragging: boolean; }; width: number; height: number; }; const RootSvg = styled.svg<{ isDragging: boolean } & SVGProps>` cursor: ${(props) => (props.isDragging ? 'grabbing' : 'grab')}; @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(359deg); } } .lineageExpandLoading { transform-box: fill-box; transform-origin: 50% 50%; animation: spin 2s linear infinite; } `; export default function LineageVizRootSvg({ zoom, margin, entityAndType, fetchedEntities, onEntityClick, onEntityCenter, onLineageExpand, selectedEntity, width, height, }: Props) { const [draggedNodes, setDraggedNodes] = useState>({}); const [hoveredEntity, setHoveredEntity] = useState(undefined); const [isDraggingNode, setIsDraggingNode] = useState(false); const [updatedLineages, setUpdatedLineages] = useState({}); const entityRegistry = useEntityRegistry(); const downstreamData = useMemo( () => constructTree(entityAndType, fetchedEntities, Direction.Downstream, entityRegistry, updatedLineages), [entityAndType, fetchedEntities, entityRegistry, updatedLineages], ); const upstreamData = useMemo( () => constructTree(entityAndType, fetchedEntities, Direction.Upstream, entityRegistry, updatedLineages), [entityAndType, fetchedEntities, entityRegistry, updatedLineages], ); // we want to clear all the dragged nodes after recentering useEffect(() => { setDraggedNodes({}); // eslint-disable-next-line react-hooks/exhaustive-deps }, [entityAndType?.entity?.urn]); return ( <> { if (!isDraggingNode) { zoom.dragMove(e); } }} onTouchStart={zoom.dragStart} onTouchMove={(e) => { if (!isDraggingNode) { zoom.dragMove(e); } }} onTouchEnd={zoom.dragEnd} isDragging={zoom.isDragging} > ); }