2024-12-30 23:50:15 +01:00
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'
2024-12-31 13:55:42 +01:00
import type { Domain } from '../../utils/api'
2024-12-30 23:50:15 +01:00
import { regionNames } from '../../i18n'
2024-08-22 01:44:50 +02:00
2024-12-30 23:50:15 +01:00
import { getCountryCode } from '../../utils/functions/getCountryCode'
import { DomainLifecycleSteps } from './DomainLifecycleSteps'
2024-12-30 14:31:31 +01:00
import { BankOutlined , KeyOutlined , SafetyCertificateOutlined } from '@ant-design/icons'
2025-01-01 02:42:51 +01:00
import { statusToTag } from '../../utils/functions/StatusToTag'
import { isDomainLocked } from "../../utils/functions/isDomainLocked"
2024-08-20 15:22:14 +02:00
export function DomainResult ( { domain } : { domain : Domain } ) {
2024-08-23 21:19:34 +02:00
const { tld , events } = domain
const domainEvents = events . sort ( ( e1 , e2 ) = > new Date ( e2 . date ) . getTime ( ) - new Date ( e1 . date ) . getTime ( ) )
2024-12-29 22:31:40 +01:00
const clientStatus = domain . status . filter ( s = > s . startsWith ( 'client' ) )
const serverStatus = domain . status . filter ( s = > ! clientStatus . includes ( s ) )
2024-12-30 23:50:15 +01:00
return (
< Space direction = 'vertical' size = 'middle' style = { { width : '100%' } } >
2024-08-22 01:44:50 +02:00
2024-12-30 23:50:15 +01:00
< 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 >
2024-08-23 21:19:34 +02:00
}
2024-12-30 23:50:15 +01:00
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
2025-01-01 02:42:51 +01:00
bordered = { false } color = { isDomainLocked ( domain . status , 'server' ) ? 'green' : 'default' }
2024-12-30 23:50:15 +01:00
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
2025-01-01 02:42:51 +01:00
bordered = { false } color = { isDomainLocked ( domain . status , 'client' ) ? 'green' : 'default' }
2024-12-30 23:50:15 +01:00
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 } / >
< / >
}
{
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 >
)
}