import type {ReactElement} from 'react' import React, {useEffect, useState} from 'react' import type {Domain} from '../../../utils/api' import {getTrackedDomainList} from '../../../utils/api' import {Button, Empty, Flex, Result, Skeleton, Table, Tag, Tooltip} from 'antd' import {t} from 'ttag' import type {ColumnType} from 'antd/es/table' import {rdapStatusCodeDetailTranslation} from '../../../utils/functions/rdapTranslation' import {eppStatusCodeToColor} from '../../../utils/functions/eppStatusCodeToColor' import {Link} from 'react-router-dom' import { BankOutlined, ExceptionOutlined, KeyOutlined, MonitorOutlined, SafetyCertificateOutlined } from '@ant-design/icons' import {DomainToTag} from '../../../utils/functions/DomainToTag' import {isDomainLocked} from "../../../utils/functions/isDomainLocked" export function TrackedDomainTable() { const REDEMPTION_NOTICE = ( redemption period ) const PENDING_DELETE_NOTICE = ( pending delete ) interface TableRow { key: string ldhName: ReactElement expirationDate: string status: ReactElement[] updatedAt: string rawDomain: Domain } const [dataTable, setDataTable] = useState([]) const [total, setTotal] = useState() const [specialNotice, setSpecialNotice] = useState([]) const rdapStatusCodeDetailTranslated = rdapStatusCodeDetailTranslation() const fetchData = (params: { page: number, itemsPerPage: number }) => { getTrackedDomainList(params).then(data => { setTotal(data['hydra:totalItems']) const notices: ReactElement[] = [] setDataTable(data['hydra:member'].map((d: Domain) => { const expirationDate = d.events.find(e => e.action === 'expiration' && !e.deleted)?.date if (d.status.includes('redemption period')) { if (!notices.includes(REDEMPTION_NOTICE)) notices.push(REDEMPTION_NOTICE) } else if (d.status.includes('pending delete')) { if (!notices.includes(PENDING_DELETE_NOTICE)) notices.push(PENDING_DELETE_NOTICE) } return { key: d.ldhName, ldhName: , expirationDate: expirationDate ? new Date(expirationDate).toLocaleString() : '-', status: d.status.map(s => {s} ), updatedAt: new Date(d.updatedAt).toLocaleString(), rawDomain: d, options: } /> } /> } /> } })) setSpecialNotice(notices) }) } useEffect(() => { fetchData({page: 1, itemsPerPage: 30}) }, []) interface RecordType { rawDomain: Domain } const columns: Array> = [ { title: t`Domain`, dataIndex: 'ldhName', width: '30%', align: 'left' }, { title: t`Options`, dataIndex: 'options', width: '10%', }, { title: t`Expiration date`, dataIndex: 'expirationDate', sorter: (a: RecordType, b: RecordType) => { const expirationDate1 = a.rawDomain.events.find(e => e.action === 'expiration' && !e.deleted)?.date const expirationDate2 = b.rawDomain.events.find(e => e.action === 'expiration' && !e.deleted)?.date if (expirationDate1 === undefined || expirationDate2 === undefined) return 0 return new Date(expirationDate1).getTime() - new Date(expirationDate2).getTime() }, width: '15%' }, { title: t`Updated at`, dataIndex: 'updatedAt', responsive: ['md'], sorter: (a: RecordType, b: RecordType) => new Date(a.rawDomain.updatedAt).getTime() - new Date(b.rawDomain.updatedAt).getTime(), width: '15%' }, { title: t`Status`, dataIndex: 'status', responsive: ['md'], showSorterTooltip: {target: 'full-header'}, filters: [...new Set(dataTable.map((d: RecordType) => d.rawDomain.status).flat())].map(s => ({ text: {s} , value: s })), onFilter: (value, record: RecordType) => record.rawDomain.status.includes(value as string), width: '30%' } ] return total === 0 ? : 0 ? { icon: , status: 'warning', title: t`At least one domain name you are tracking requires special attention`, extra: specialNotice } : { icon: , status: 'info', title: t`The domain names below are subject to special monitoring` })} /> { fetchData({page, itemsPerPage}) } }} scroll={{y: '50vh'}} /> }