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

84 lines
3.0 KiB
TypeScript
Raw Normal View History

2024-12-30 23:50:15 +01:00
import {Button, Flex, Modal, Space, Typography} from 'antd'
import {t} from 'ttag'
import React, {useEffect, useState} from 'react'
import {ApartmentOutlined} from '@ant-design/icons'
2024-08-15 22:58:15 +02:00
2024-08-16 03:54:48 +02:00
import '@xyflow/react/dist/style.css'
2024-12-31 13:55:42 +01:00
import type { Edge, Node} from '@xyflow/react'
import {Background, Controls, MiniMap, ReactFlow, useEdgesState, useNodesState} from '@xyflow/react'
2024-12-30 23:50:15 +01:00
import {getWatchlist} from '../../../../utils/api'
import {getLayoutedElements} from './getLayoutedElements'
import {watchlistToNodes} from './watchlistToNodes'
import {watchlistToEdges} from './watchlistToEdges'
2024-08-16 03:54:48 +02:00
export function ViewDiagramWatchlistButton({token}: { token: string }) {
const [open, setOpen] = useState(false)
2024-08-16 03:54:48 +02:00
const [loading, setLoading] = useState(false)
2024-12-30 23:50:15 +01:00
const [nodes, setNodes, onNodesChange] = useNodesState<Node>([])
const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([])
2024-08-16 03:54:48 +02:00
useEffect(() => {
2024-08-18 14:48:19 +02:00
setEdges([])
2024-08-18 17:28:45 +02:00
setNodes([])
}, [])
2024-08-18 14:48:19 +02:00
2024-08-18 17:28:45 +02:00
useEffect(() => {
2024-08-16 03:54:48 +02:00
if (!open) return
setLoading(true)
getWatchlist(token).then(w => {
2024-08-22 01:44:50 +02:00
const e = getLayoutedElements(watchlistToNodes(w, true), watchlistToEdges(w, true))
2024-08-16 03:54:48 +02:00
setNodes(e.nodes)
setEdges(e.edges)
}).catch(() => setOpen(false)).finally(() => setLoading(false))
}, [open])
2024-12-30 23:50:15 +01: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}
loading={loading}
footer={
<Space>
<Button type='default' onClick={() => setOpen(false)}>
Close
</Button>
</Space>
}
onOk={() => setOpen(false)}
onCancel={() => setOpen(false)}
width='90vw'
height='100%'
>
<Flex style={{width: '85vw', height: '85vh'}}>
<ReactFlow
fitView
colorMode='dark'
defaultEdges={[]}
defaultNodes={[]}
nodesConnectable={false}
edgesReconnectable={false}
nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
style={{width: '100%', height: '100%'}}
>
<MiniMap/>
<Controls/>
<Background/>
</ReactFlow>
</Flex>
</Modal>
</>
)
}