domain-watchdog/assets/components/tracking/watchlist/diagram/ViewDiagramWatchlistButton.tsx

82 lines
2.7 KiB
TypeScript
Raw Normal View History

2024-08-16 03:54:48 +02:00
import {Button, Flex, Modal, Space, Typography} from "antd"
2024-08-15 22:58:15 +02:00
import {t} from "ttag"
2024-08-16 03:54:48 +02:00
import React, {useEffect, useState} from "react"
2024-08-15 22:58:15 +02:00
import {ApartmentOutlined} from "@ant-design/icons"
2024-08-16 03:54:48 +02:00
import '@xyflow/react/dist/style.css'
import {Background, Controls, MiniMap, ReactFlow, useEdgesState, useNodesState} from "@xyflow/react";
import {getWatchlist} from "../../../../utils/api";
2024-08-16 13:56:52 +02:00
import {getLayoutedElements} from "./getLayoutedElements";
import {watchlistToNodes} from "./watchlistToNodes";
import {watchlistToEdges} from "./watchlistToEdges";
2024-08-16 03:54:48 +02:00
2024-08-17 18:22:24 +02:00
export type DiagramConfig = {
tld?: boolean
nameserver?: boolean
entities?: boolean
2024-08-16 03:54:48 +02:00
}
export function ViewDiagramWatchlistButton({token}: { token: string }) {
2024-08-15 22:58:15 +02:00
const [open, setOpen] = useState(false)
2024-08-16 03:54:48 +02:00
const [loading, setLoading] = useState(false)
2024-08-17 18:22:24 +02:00
const [nodes, setNodes, onNodesChange] = useNodesState([])
const [edges, setEdges, onEdgesChange] = useEdgesState([])
2024-08-16 03:54:48 +02:00
useEffect(() => {
2024-08-18 14:48:19 +02:00
setNodes([])
setEdges([])
2024-08-16 03:54:48 +02:00
if (!open) return
setLoading(true)
getWatchlist(token).then(w => {
const e = getLayoutedElements(watchlistToNodes(w), watchlistToEdges(w))
setNodes(e.nodes)
setEdges(e.edges)
}).catch(() => setOpen(false)).finally(() => setLoading(false))
}, [open])
2024-08-15 22:58:15 +02:00
return <>
<Typography.Link>
<ApartmentOutlined title={t`View the Watchlist Entity Diagram`}
style={{color: 'darkviolet'}}
onClick={() => setOpen(true)}/>
</Typography.Link>
<Modal
title={t`Watchlist Entity Diagram`}
centered
open={open}
2024-08-16 03:54:48 +02:00
loading={loading}
2024-08-15 22:58:15 +02:00
footer={
<Space>
<Button type="default" onClick={() => setOpen(false)}>
Close
</Button>
</Space>
}
onOk={() => setOpen(false)}
onCancel={() => setOpen(false)}
2024-08-18 14:42:25 +02:00
width='85vw'
2024-08-15 22:58:15 +02:00
>
2024-08-18 14:42:25 +02:00
<Flex style={{width: '80vw', height: '80vh'}}>
2024-08-16 03:54:48 +02:00
<ReactFlow
2024-08-16 13:56:52 +02:00
fitView
colorMode='system'
nodesConnectable={false}
edgesReconnectable={false}
2024-08-16 03:54:48 +02:00
nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
style={{width: '100%', height: '100vh'}}
>
<MiniMap/>
<Controls/>
<Background/>
</ReactFlow>
2024-08-18 14:42:25 +02:00
</Flex>
2024-08-15 22:58:15 +02:00
</Modal>
</>
}