mirror of
https://github.com/maelgangloff/domain-watchdog.git
synced 2025-12-18 02:05:36 +00:00
124 lines
6.3 KiB
TypeScript
124 lines
6.3 KiB
TypeScript
import {Badge, Card, Col, Divider, Flex, Row, Space, Tag, Tooltip, Typography} from 'antd'
|
|
import {t} from 'ttag'
|
|
import {EventTimeline} from './EventTimeline'
|
|
import {EntitiesList} from './EntitiesList'
|
|
import {DomainDiagram} from './DomainDiagram'
|
|
import React from 'react'
|
|
import type {Domain} from '../../utils/api'
|
|
import {regionNames} from '../../i18n'
|
|
|
|
import {getCountryCode} from '../../utils/functions/getCountryCode'
|
|
import {DomainLifecycleSteps} from './DomainLifecycleSteps'
|
|
import {BankOutlined, KeyOutlined, SafetyCertificateOutlined} from '@ant-design/icons'
|
|
import {statusToTag} from '../../utils/functions/StatusToTag'
|
|
import {isDomainLocked} from "../../utils/functions/isDomainLocked"
|
|
|
|
export function DomainResult({domain}: { domain: Domain }) {
|
|
const {tld, events} = domain
|
|
const domainEvents = events.sort((e1, e2) => new Date(e2.date).getTime() - new Date(e1.date).getTime())
|
|
const clientStatus = domain.status.filter(s => s.startsWith('client'))
|
|
const serverStatus = domain.status.filter(s => !clientStatus.includes(s))
|
|
|
|
return (
|
|
<Space direction='vertical' size='middle' style={{width: '100%'}}>
|
|
|
|
<Badge.Ribbon
|
|
text={
|
|
<Tooltip
|
|
title={tld.type === 'ccTLD' ? regionNames.of(getCountryCode(tld.tld)) : tld.type === 'gTLD' ? tld?.registryOperator : undefined}
|
|
>
|
|
{`${domain.tld.tld.toUpperCase()} (${tld.type})`}
|
|
</Tooltip>
|
|
}
|
|
color={
|
|
tld.type === 'ccTLD'
|
|
? 'purple'
|
|
: (tld.type === 'gTLD' && tld.specification13)
|
|
? 'volcano'
|
|
: tld.type === 'gTLD'
|
|
? 'green'
|
|
: 'cyan'
|
|
}
|
|
>
|
|
|
|
<Card
|
|
title={<Space>
|
|
{domain.ldhName}{domain.handle && <Typography.Text code>{domain.handle}</Typography.Text>}
|
|
</Space>}
|
|
size='small'
|
|
>
|
|
{
|
|
domain.events.length > 0 && <DomainLifecycleSteps status={domain.status}/>
|
|
}
|
|
<Row gutter={8}>
|
|
<Col span={24} xl={12} xxl={12}>
|
|
<Flex justify='center' align='center' style={{margin: 10}} wrap gap='4px 0'>
|
|
<Tooltip
|
|
title={t`Registry-level protection, ensuring the highest level of security by preventing unauthorized, unwanted, or accidental changes to the domain name at the registry level`}
|
|
>
|
|
<Tag
|
|
bordered={false}
|
|
color={isDomainLocked(domain.status, 'server') ? 'green' : 'default'}
|
|
icon={<SafetyCertificateOutlined
|
|
style={{fontSize: '16px'}}
|
|
/>}
|
|
>{t`Registry Lock`}
|
|
</Tag>
|
|
</Tooltip>
|
|
<Tooltip
|
|
title={t`Registrar-level protection, safeguarding the domain from unauthorized, unwanted, or accidental changes through registrar controls`}
|
|
>
|
|
<Tag
|
|
bordered={false}
|
|
color={isDomainLocked(domain.status, 'client') ? 'green' : 'default'}
|
|
icon={<BankOutlined
|
|
style={{fontSize: '16px'}}
|
|
/>}
|
|
>{t`Registrar Lock`}
|
|
</Tag>
|
|
</Tooltip>
|
|
<Tooltip
|
|
title={t`DNSSEC secures DNS by adding cryptographic signatures to DNS records, ensuring authenticity and integrity of responses`}
|
|
>
|
|
<Tag
|
|
bordered={false} color={domain.delegationSigned ? 'green' : 'default'}
|
|
icon={<KeyOutlined style={{fontSize: '16px'}}/>}
|
|
>{t`DNSSEC`}
|
|
</Tag>
|
|
</Tooltip>
|
|
</Flex>
|
|
{domain.status.length > 0 &&
|
|
<>
|
|
<Divider orientation='left'>{t`EPP Status Codes`}</Divider>
|
|
<Flex gap='4px 0' wrap>
|
|
{serverStatus.map(statusToTag)}
|
|
{clientStatus.map(statusToTag)}
|
|
</Flex>
|
|
</>}
|
|
{
|
|
domain.events.length > 0 && <>
|
|
<Divider orientation='left'>{t`Timeline`}</Divider>
|
|
<EventTimeline events={domainEvents}
|
|
expiresInDays={domain.expiresInDays}
|
|
isRenewalPeriod={domain.status.includes('auto renew period') || domain.status.includes('renew period')}
|
|
/>
|
|
</>
|
|
}
|
|
{
|
|
domain.entities.length > 0 &&
|
|
<>
|
|
<Divider orientation='left'>{t`Entities`}</Divider>
|
|
<EntitiesList domain={domain}/>
|
|
</>
|
|
}
|
|
</Col>
|
|
<Col span={24} xl={12} xxl={12}>
|
|
<DomainDiagram domain={domain}/>
|
|
</Col>
|
|
</Row>
|
|
</Card>
|
|
</Badge.Ribbon>
|
|
</Space>
|
|
)
|
|
}
|