2024-08-17 21:52:40 +02:00
|
|
|
import React, {useEffect} from "react";
|
|
|
|
|
import {Background, Controls, MiniMap, ReactFlow, useEdgesState, useNodesState} from "@xyflow/react";
|
|
|
|
|
import {Flex} from "antd";
|
|
|
|
|
import {Domain} from "../../utils/api";
|
|
|
|
|
import {getLayoutedElements} from "../tracking/watchlist/diagram/getLayoutedElements";
|
|
|
|
|
import {domainEntitiesToNode, domainToNode, nsToNode, tldToNode} from "../tracking/watchlist/diagram/watchlistToNodes";
|
|
|
|
|
import {domainEntitiesToEdges, domainNSToEdges, tldToEdge} from "../tracking/watchlist/diagram/watchlistToEdges";
|
|
|
|
|
|
|
|
|
|
export function DomainDiagram({domain}: { domain: Domain }) {
|
|
|
|
|
const [nodes, setNodes, onNodesChange] = useNodesState([])
|
|
|
|
|
const [edges, setEdges, onEdgesChange] = useEdgesState([])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const e = getLayoutedElements([
|
|
|
|
|
domainToNode(domain),
|
2024-08-18 03:28:53 +02:00
|
|
|
...domainEntitiesToNode(domain, true),
|
2024-08-17 21:52:40 +02:00
|
|
|
tldToNode(domain.tld),
|
|
|
|
|
...domain.nameservers.map(nsToNode)
|
|
|
|
|
].flat(), [
|
2024-08-18 03:28:53 +02:00
|
|
|
domainEntitiesToEdges(domain, true),
|
2024-08-17 21:52:40 +02:00
|
|
|
tldToEdge(domain),
|
|
|
|
|
...domainNSToEdges(domain)
|
|
|
|
|
].flat())
|
|
|
|
|
|
|
|
|
|
setNodes(e.nodes)
|
|
|
|
|
setEdges(e.edges)
|
|
|
|
|
}, [])
|
|
|
|
|
|
2024-08-19 22:24:20 +02:00
|
|
|
return <Flex style={{width: '100%', height: '100vh'}}>
|
2024-08-17 21:52:40 +02:00
|
|
|
<ReactFlow
|
|
|
|
|
fitView
|
2024-08-18 03:28:53 +02:00
|
|
|
colorMode='dark'
|
2024-08-17 21:52:40 +02:00
|
|
|
nodesConnectable={false}
|
|
|
|
|
edgesReconnectable={false}
|
|
|
|
|
nodes={nodes}
|
|
|
|
|
edges={edges}
|
|
|
|
|
onNodesChange={onNodesChange}
|
|
|
|
|
onEdgesChange={onEdgesChange}
|
|
|
|
|
style={{width: '100%', height: '100%'}}
|
|
|
|
|
>
|
|
|
|
|
<MiniMap/>
|
|
|
|
|
<Controls/>
|
|
|
|
|
<Background/>
|
|
|
|
|
</ReactFlow>
|
|
|
|
|
</Flex>
|
|
|
|
|
}
|