96 lines
3.9 KiB
TypeScript
Raw Normal View History

2024-08-22 01:50:16 +02:00
import {Card, Divider, Space, Table, Tag, Tooltip} from "antd";
2024-08-18 17:28:45 +02:00
import {DisconnectOutlined, LinkOutlined} from "@ant-design/icons";
import {t} from "ttag";
import {ViewDiagramWatchlistButton} from "./diagram/ViewDiagramWatchlistButton";
import {UpdateWatchlistButton} from "./UpdateWatchlistButton";
import {DeleteWatchlistButton} from "./DeleteWatchlistButton";
import punycode from "punycode/punycode";
2024-08-20 15:22:14 +02:00
import React from "react";
2024-08-18 17:28:45 +02:00
import {Watchlist} from "../../../pages/tracking/WatchlistPage";
import {Connector} from "../../../utils/api/connectors";
import useBreakpoint from "../../../hooks/useBreakpoint";
import {CalendarWatchlistButton} from "./CalendarWatchlistButton";
2024-08-23 21:19:34 +02:00
import {rdapEventDetailTranslation, rdapEventNameTranslation} from "../../../utils/functions/rdapTranslation";
2024-08-22 01:44:50 +02:00
import {actionToColor} from "../../../utils/functions/actionToColor";
2024-08-18 17:28:45 +02:00
export function WatchlistCard({watchlist, onUpdateWatchlist, connectors, onDelete}: {
watchlist: Watchlist,
onUpdateWatchlist: (values: { domains: string[], triggers: string[], token: string }) => Promise<void>,
connectors: (Connector & { id: string })[],
onDelete: () => void
}) {
const sm = useBreakpoint('sm')
2024-08-20 15:22:14 +02:00
const rdapEventNameTranslated = rdapEventNameTranslation()
2024-08-20 19:15:04 +02:00
const rdapEventDetailTranslated = rdapEventDetailTranslation()
2024-08-18 17:28:45 +02:00
const columns = [
{
title: t`Domain names`,
dataIndex: 'domains'
},
{
title: t`Tracked events`,
dataIndex: 'events'
}
]
return <>
<Card
type='inner'
title={<>
{
watchlist.connector ?
2024-08-22 01:50:16 +02:00
<Tooltip title={watchlist.connector.id}>
<Tag icon={<LinkOutlined/>} color="lime-inverse"/>
</Tooltip> :
<Tooltip title={t`This Watchlist is not linked to a Connector.`}>
<Tag icon={<DisconnectOutlined/>} color="default"/>
</Tooltip>
2024-08-18 17:28:45 +02:00
}
2024-08-22 01:50:16 +02:00
<Tooltip title={new Date(watchlist.createdAt).toLocaleString()}>
2024-08-18 17:28:45 +02:00
{t`Watchlist` + (watchlist.name ? ` (${watchlist.name})` : '')}
2024-08-22 01:50:16 +02:00
</Tooltip>
2024-08-18 17:28:45 +02:00
</>
}
size='small'
style={{width: '100%'}}
extra={
<Space size='middle'>
<ViewDiagramWatchlistButton token={watchlist.token}/>
<CalendarWatchlistButton watchlist={watchlist}/>
<UpdateWatchlistButton
watchlist={watchlist}
onUpdateWatchlist={onUpdateWatchlist}
connectors={connectors}
/>
<DeleteWatchlistButton watchlist={watchlist} onDelete={onDelete}/>
</Space>
}
>
<Card.Meta description={watchlist.token} style={{marginBottom: '1em'}}/>
<Table
size='small'
columns={columns}
pagination={false}
style={{width: '100%'}}
dataSource={[{
domains: watchlist.domains.map(d => <Tag>{punycode.toUnicode(d.ldhName)}</Tag>),
events: watchlist.triggers?.filter(t => t.action === 'email')
2024-08-20 19:15:04 +02:00
.map(t => <Tooltip
title={t.event in rdapEventDetailTranslated ? rdapEventDetailTranslated[t.event as keyof typeof rdapEventDetailTranslated] : undefined}>
2024-08-21 02:18:14 +02:00
<Tag color={actionToColor(t.event)}>
2024-08-20 19:15:04 +02:00
{rdapEventNameTranslated[t.event as keyof typeof rdapEventNameTranslated]}
</Tag>
</Tooltip>
2024-08-18 17:28:45 +02:00
)
}]}
{...(sm ? {scroll: {y: 'max-content'}} : {scroll: {y: 240}})}
/>
</Card>
<Divider/>
</>
}