refactor: move functions

This commit is contained in:
Maël Gangloff
2024-08-22 01:44:50 +02:00
parent 7ece681d73
commit 5ae0b836a5
25 changed files with 244 additions and 215 deletions

View File

@@ -4,7 +4,8 @@ import React, {useContext, useEffect} from "react";
import {getUser, login} from "../utils/api"; import {getUser, login} from "../utils/api";
import {AuthenticatedContext} from "../pages/LoginPage"; import {AuthenticatedContext} from "../pages/LoginPage";
import {useNavigate} from "react-router-dom"; import {useNavigate} from "react-router-dom";
import {showErrorAPI} from "../utils";
import {showErrorAPI} from "../utils/functions/showErrorAPI";
type FieldType = { type FieldType = {

View File

@@ -3,7 +3,8 @@ import {t} from "ttag";
import React, {useState} from "react"; import React, {useState} from "react";
import {register} from "../utils/api"; import {register} from "../utils/api";
import {useNavigate} from "react-router-dom"; import {useNavigate} from "react-router-dom";
import {showErrorAPI} from "../utils";
import {showErrorAPI} from "../utils/functions/showErrorAPI";
type FieldType = { type FieldType = {

View File

@@ -6,19 +6,30 @@ import {DomainDiagram} from "./DomainDiagram";
import React from "react"; import React from "react";
import {Domain} from "../../utils/api"; import {Domain} from "../../utils/api";
import {rdapStatusCodeDetailTranslation} from "./rdapTranslation"; import {rdapStatusCodeDetailTranslation} from "./rdapTranslation";
import {regionNames} from "../../i18n";
import {getCountryCode} from "../../utils/functions/getCountryCode";
export function DomainResult({domain}: { domain: Domain }) { export function DomainResult({domain}: { domain: Domain }) {
const rdapStatusCodeDetailTranslated = rdapStatusCodeDetailTranslation() const rdapStatusCodeDetailTranslated = rdapStatusCodeDetailTranslation()
const {tld} = domain
return <Space direction="vertical" size="middle" style={{width: '100%'}}> return <Space direction="vertical" size="middle" style={{width: '100%'}}>
<Badge.Ribbon text={`.${domain.tld.tld.toUpperCase()} (${domain.tld.type})`}
<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={ color={
domain.tld.type === 'ccTLD' ? 'purple' : tld.type === 'ccTLD' ? 'purple' :
(domain.tld.type === 'gTLD' && domain.tld.specification13) ? "volcano" : (tld.type === 'gTLD' && tld.specification13) ? "volcano" :
domain.tld.type === 'gTLD' ? "green" tld.type === 'gTLD' ? "green"
: "cyan" : "cyan"
}> }>
<Card title={<Space> <Card title={<Space>
{domain.ldhName}{domain.handle && <Typography.Text code>{domain.handle}</Typography.Text>} {domain.ldhName}{domain.handle && <Typography.Text code>{domain.handle}</Typography.Text>}
</Space>} </Space>}

View File

@@ -2,7 +2,10 @@ import {List, Tag, Tooltip} from "antd";
import React from "react"; import React from "react";
import {Domain} from "../../utils/api"; import {Domain} from "../../utils/api";
import {rdapRoleDetailTranslation, rdapRoleTranslation} from "./rdapTranslation"; import {rdapRoleDetailTranslation, rdapRoleTranslation} from "./rdapTranslation";
import {entityToName, rolesToColor, roleToAvatar, sortDomainEntities} from "../../utils"; import {roleToAvatar} from "../../utils/functions/roleToAvatar";
import {rolesToColor} from "../../utils/functions/rolesToColor";
import {entityToName} from "../../utils/functions/entityToName";
import {sortDomainEntities} from "../../utils/functions/sortDomainEntities";
export function EntitiesList({domain}: { domain: Domain }) { export function EntitiesList({domain}: { domain: Domain }) {

View File

@@ -3,7 +3,8 @@ import React from "react";
import {Domain} from "../../utils/api"; import {Domain} from "../../utils/api";
import useBreakpoint from "../../hooks/useBreakpoint"; import useBreakpoint from "../../hooks/useBreakpoint";
import {rdapEventDetailTranslation, rdapEventNameTranslation} from "./rdapTranslation"; import {rdapEventDetailTranslation, rdapEventNameTranslation} from "./rdapTranslation";
import {actionToColor, actionToIcon} from "../../utils"; import {actionToColor} from "../../utils/functions/actionToColor";
import {actionToIcon} from "../../utils/functions/actionToIcon";
export function EventTimeline({domain}: { domain: Domain }) { export function EventTimeline({domain}: { domain: Domain }) {
const sm = useBreakpoint('sm') const sm = useBreakpoint('sm')

View File

@@ -11,7 +11,8 @@ import {Connector} from "../../../utils/api/connectors";
import useBreakpoint from "../../../hooks/useBreakpoint"; import useBreakpoint from "../../../hooks/useBreakpoint";
import {CalendarWatchlistButton} from "./CalendarWatchlistButton"; import {CalendarWatchlistButton} from "./CalendarWatchlistButton";
import {rdapEventDetailTranslation, rdapEventNameTranslation} from "../../search/rdapTranslation"; import {rdapEventDetailTranslation, rdapEventNameTranslation} from "../../search/rdapTranslation";
import {actionToColor} from "../../../utils";
import {actionToColor} from "../../../utils/functions/actionToColor";
export function WatchlistCard({watchlist, onUpdateWatchlist, connectors, onDelete}: { export function WatchlistCard({watchlist, onUpdateWatchlist, connectors, onDelete}: {
watchlist: Watchlist, watchlist: Watchlist,

View File

@@ -4,7 +4,8 @@ import {ApiOutlined, MinusCircleOutlined, PlusOutlined} from "@ant-design/icons"
import React from "react"; import React from "react";
import {Connector} from "../../../utils/api/connectors"; import {Connector} from "../../../utils/api/connectors";
import {rdapEventDetailTranslation, rdapEventNameTranslation} from "../../search/rdapTranslation"; import {rdapEventDetailTranslation, rdapEventNameTranslation} from "../../search/rdapTranslation";
import {actionToColor, actionToIcon} from "../../../utils"; import {actionToColor} from "../../../utils/functions/actionToColor";
import {actionToIcon} from "../../../utils/functions/actionToIcon";
type TagRender = SelectProps['tagRender']; type TagRender = SelectProps['tagRender'];

View File

@@ -26,7 +26,7 @@ export function ViewDiagramWatchlistButton({token}: { token: string }) {
if (!open) return if (!open) return
setLoading(true) setLoading(true)
getWatchlist(token).then(w => { getWatchlist(token).then(w => {
const e = getLayoutedElements(watchlistToNodes(w), watchlistToEdges(w)) const e = getLayoutedElements(watchlistToNodes(w, true), watchlistToEdges(w, true))
setNodes(e.nodes) setNodes(e.nodes)
setEdges(e.edges) setEdges(e.edges)
}).catch(() => setOpen(false)).finally(() => setLoading(false)) }).catch(() => setOpen(false)).finally(() => setLoading(false))

View File

@@ -1,7 +1,8 @@
import {Domain, Watchlist} from "../../../../utils/api"; import {Domain, Watchlist} from "../../../../utils/api";
import {rdapRoleTranslation} from "../../../search/rdapTranslation"; import {rdapRoleTranslation} from "../../../search/rdapTranslation";
import {t} from "ttag"; import {t} from "ttag";
import {rolesToColor} from "../../../../utils";
import {rolesToColor} from "../../../../utils/functions/rolesToColor";
export function domainEntitiesToEdges(d: Domain, withRegistrar = false) { export function domainEntitiesToEdges(d: Domain, withRegistrar = false) {
const rdapRoleTranslated = rdapRoleTranslation() const rdapRoleTranslated = rdapRoleTranslation()

View File

@@ -1,7 +1,8 @@
import {Domain, Nameserver, Tld, Watchlist} from "../../../../utils/api"; import {Domain, Nameserver, Tld, Watchlist} from "../../../../utils/api";
import React from "react"; import React from "react";
import {t} from 'ttag' import {t} from 'ttag'
import {entityToName} from "../../../../utils";
import {entityToName} from "../../../../utils/functions/entityToName";
export const domainToNode = (d: Domain) => ({ export const domainToNode = (d: Domain) => ({
id: d.ldhName, id: d.ldhName,

View File

@@ -6,28 +6,14 @@ import {regionNames} from "../../i18n";
import useBreakpoint from "../../hooks/useBreakpoint"; import useBreakpoint from "../../hooks/useBreakpoint";
import {ColumnType} from "antd/es/table"; import {ColumnType} from "antd/es/table";
import punycode from "punycode/punycode"; import punycode from "punycode/punycode";
import {getCountryCode} from "../../utils/functions/getCountryCode";
import {tldToEmoji} from "../../utils/functions/tldToEmoji";
const {Text, Paragraph} = Typography const {Text, Paragraph} = Typography
type TldType = 'iTLD' | 'sTLD' | 'gTLD' | 'ccTLD' type TldType = 'iTLD' | 'sTLD' | 'gTLD' | 'ccTLD'
type FiltersType = { type: TldType, contractTerminated?: boolean, specification13?: boolean } type FiltersType = { type: TldType, contractTerminated?: boolean, specification13?: boolean }
const toEmoji = (tld: string) => {
if (tld.startsWith('xn--')) return '-'
return String.fromCodePoint(
...getCountryCode(tld)
.toUpperCase()
.split('')
.map((char) => 127397 + char.charCodeAt(0))
)
}
const getCountryCode = (tld: string): string => {
const exceptions = {uk: 'gb', su: 'ru', tp: 'tl'}
if (tld in exceptions) return exceptions[tld as keyof typeof exceptions]
return tld.toUpperCase()
}
function TldTable(filters: FiltersType) { function TldTable(filters: FiltersType) {
const sm = useBreakpoint('sm') const sm = useBreakpoint('sm')
@@ -55,7 +41,7 @@ function TldTable(filters: FiltersType) {
return { return {
...rowData, ...rowData,
Flag: toEmoji(tld.tld), Flag: tldToEmoji(tld.tld),
Country: countryName Country: countryName
} }
case 'gTLD': case 'gTLD':

View File

@@ -4,8 +4,8 @@ import {Domain, getDomain} from "../../utils/api";
import {AxiosError} from "axios" import {AxiosError} from "axios"
import {t} from 'ttag' import {t} from 'ttag'
import {DomainSearchBar, FieldType} from "../../components/search/DomainSearchBar"; import {DomainSearchBar, FieldType} from "../../components/search/DomainSearchBar";
import {showErrorAPI} from "../../utils";
import {DomainResult} from "../../components/search/DomainResult"; import {DomainResult} from "../../components/search/DomainResult";
import {showErrorAPI} from "../../utils/functions/showErrorAPI";
export default function DomainSearchPage() { export default function DomainSearchPage() {
const [domain, setDomain] = useState<Domain | null>() const [domain, setDomain] = useState<Domain | null>()

View File

@@ -5,7 +5,8 @@ import {Connector, getConnectors, postConnector} from "../../utils/api/connector
import {ConnectorForm} from "../../components/tracking/connector/ConnectorForm"; import {ConnectorForm} from "../../components/tracking/connector/ConnectorForm";
import {AxiosError} from "axios"; import {AxiosError} from "axios";
import {ConnectorElement, ConnectorsList} from "../../components/tracking/connector/ConnectorsList"; import {ConnectorElement, ConnectorsList} from "../../components/tracking/connector/ConnectorsList";
import {showErrorAPI} from "../../utils";
import {showErrorAPI} from "../../utils/functions/showErrorAPI";
export default function ConnectorsPage() { export default function ConnectorsPage() {
const [form] = Form.useForm() const [form] = Form.useForm()

View File

@@ -6,7 +6,8 @@ import {t} from 'ttag'
import {WatchlistForm} from "../../components/tracking/watchlist/WatchlistForm"; import {WatchlistForm} from "../../components/tracking/watchlist/WatchlistForm";
import {WatchlistsList} from "../../components/tracking/watchlist/WatchlistsList"; import {WatchlistsList} from "../../components/tracking/watchlist/WatchlistsList";
import {Connector, getConnectors} from "../../utils/api/connectors"; import {Connector, getConnectors} from "../../utils/api/connectors";
import {showErrorAPI} from "../../utils";
import {showErrorAPI} from "../../utils/functions/showErrorAPI";
export type Watchlist = { export type Watchlist = {

View File

@@ -0,0 +1,11 @@
import {EventAction} from "../api";
export const actionToColor = (a: EventAction) => a === 'registration' ? 'green' :
a === 'reregistration' ? 'cyan' :
a === 'expiration' ? 'red' :
a === 'deletion' ? 'magenta' :
a === 'transfer' ? 'orange' :
a === 'last changed' ? 'blue' :
a === 'registrar expiration' ? 'red' :
a === 'reinstantiation' ? 'purple' :
a === 'enum validation expiration' ? 'red' : 'default'

View File

@@ -0,0 +1,26 @@
import {EventAction} from "../api";
import {
ClockCircleOutlined,
DeleteOutlined,
LockOutlined,
ReloadOutlined,
ShareAltOutlined,
SignatureOutlined,
SyncOutlined,
UnlockOutlined
} from "@ant-design/icons";
import React from "react";
export const actionToIcon = (a: EventAction) => a === 'registration' ?
<SignatureOutlined style={{fontSize: '16px'}}/> : a === 'expiration' ?
<ClockCircleOutlined style={{fontSize: '16px'}}/> : a === 'transfer' ?
<ShareAltOutlined style={{fontSize: '16px'}}/> : a === 'last changed' ?
<SyncOutlined style={{fontSize: '16px'}}/> : a === 'deletion' ?
<DeleteOutlined style={{fontSize: '16px'}}/> : a === 'reregistration' ?
<ReloadOutlined style={{fontSize: '16px'}}/> : a === 'locked' ?
<LockOutlined style={{fontSize: '16px'}}/> : a === 'unlocked' ?
<UnlockOutlined style={{fontSize: '16px'}}/> : a === 'registrar expiration' ?
<ClockCircleOutlined
style={{fontSize: '16px'}}/> : a === 'enum validation expiration' ?
<ClockCircleOutlined style={{fontSize: '16px'}}/> : a === 'reinstantiation' ?
<ReloadOutlined style={{fontSize: '16px'}}/> : undefined

View File

@@ -0,0 +1,11 @@
import {Entity} from "../api";
import vCard from "vcf";
export const entityToName = (e: { entity: Entity }): string => {
if (e.entity.jCard.length === 0) return e.entity.handle
const jCard = vCard.fromJSON(e.entity.jCard)
let name = e.entity.handle
if (jCard.data.fn && !Array.isArray(jCard.data.fn) && jCard.data.fn.valueOf() !== '') name = jCard.data.fn.valueOf()
return name
}

View File

@@ -0,0 +1,5 @@
export const getCountryCode = (tld: string): string => {
const exceptions = {uk: 'gb', su: 'ru', tp: 'tl'}
if (tld in exceptions) return exceptions[tld as keyof typeof exceptions]
return tld.toUpperCase()
}

View File

@@ -0,0 +1,24 @@
import {Avatar} from "antd";
import {
BankOutlined,
DollarOutlined,
IdcardOutlined,
SignatureOutlined,
ToolOutlined,
UserOutlined
} from "@ant-design/icons";
import React from "react";
import {rolesToColor} from "./rolesToColor";
export const roleToAvatar = (e: { roles: string[] }) => <Avatar style={{backgroundColor: rolesToColor(e.roles)}}
icon={e.roles.includes('registrant') ?
<SignatureOutlined/> : e.roles.includes('registrar') ?
<BankOutlined/> :
e.roles.includes('technical') ?
<ToolOutlined/> :
e.roles.includes('administrative') ?
<IdcardOutlined/> :
e.roles.includes('billing') ?
<DollarOutlined/> :
<UserOutlined/>}/>

View File

@@ -0,0 +1,6 @@
export const rolesToColor = (roles: string[]) => roles.includes('registrant') ? 'green' :
roles.includes('administrative') ? 'blue' :
roles.includes('technical') ? 'orange' :
roles.includes('registrar') ? 'purple' :
roles.includes('sponsor') ? 'magenta' :
roles.includes('billing') ? 'cyan' : 'default'

View File

@@ -0,0 +1,27 @@
import {AxiosError, AxiosResponse} from "axios";
import {MessageInstance, MessageType} from "antd/lib/message/interface";
import {t} from "ttag";
export function showErrorAPI(e: AxiosError, messageApi: MessageInstance): MessageType | undefined {
const response = e.response as AxiosResponse
const data = response.data
if ('message' in data) {
return messageApi.error(data.message as string)
}
if (!('detail' in data)) return
const detail = data.detail as string
if (response.status === 429) {
const duration = response.headers['retry-after']
return messageApi.error(t`Please retry after ${duration} seconds`)
}
if (response.status.toString()[0] === '4') {
return messageApi.warning(detail !== '' ? detail : t`An error occurred`)
}
return messageApi.error(detail !== '' ? detail : t`An error occurred`)
}

View File

@@ -0,0 +1,9 @@
import {Domain} from "../api";
export const sortDomainEntities = (domain: Domain) => domain.entities.sort((e1, e2) => {
const p = (r: string[]) => r.includes('registrant') ? 5 :
r.includes('administrative') ? 4 :
r.includes('billing') ? 3 :
r.includes('registrar') ? 2 : 1
return p(e2.roles) - p(e1.roles)
})

View File

@@ -0,0 +1,12 @@
import {getCountryCode} from "./getCountryCode";
export const tldToEmoji = (tld: string) => {
if (tld.startsWith('xn--')) return '-'
return String.fromCodePoint(
...getCountryCode(tld)
.toUpperCase()
.split('')
.map((char) => 127397 + char.charCodeAt(0))
)
}

View File

@@ -1,111 +0,0 @@
import {MessageInstance, MessageType} from "antd/lib/message/interface";
import {AxiosError, AxiosResponse} from "axios";
import {t} from "ttag";
import {Avatar} from "antd";
import {
BankOutlined,
ClockCircleOutlined,
DeleteOutlined,
DollarOutlined,
IdcardOutlined,
LockOutlined,
ReloadOutlined,
ShareAltOutlined,
SignatureOutlined,
SyncOutlined,
ToolOutlined,
UnlockOutlined,
UserOutlined
} from "@ant-design/icons";
import {Domain, Entity, EventAction} from "./api";
import vCard from "vcf";
import React from "react";
export const roleToAvatar = (e: { roles: string[] }) => <Avatar style={{backgroundColor: rolesToColor(e.roles)}}
icon={e.roles.includes('registrant') ?
<SignatureOutlined/> : e.roles.includes('registrar') ?
<BankOutlined/> :
e.roles.includes('technical') ?
<ToolOutlined/> :
e.roles.includes('administrative') ?
<IdcardOutlined/> :
e.roles.includes('billing') ?
<DollarOutlined/> :
<UserOutlined/>}/>
export const rolesToColor = (roles: string[]) => roles.includes('registrant') ? 'green' :
roles.includes('administrative') ? 'blue' :
roles.includes('technical') ? 'orange' :
roles.includes('registrar') ? 'purple' :
roles.includes('sponsor') ? 'magenta' :
roles.includes('billing') ? 'cyan' : 'default'
export const actionToColor = (a: EventAction) => a === 'registration' ? 'green' :
a === 'reregistration' ? 'cyan' :
a === 'expiration' ? 'red' :
a === 'deletion' ? 'magenta' :
a === 'transfer' ? 'orange' :
a === 'last changed' ? 'blue' :
a === 'registrar expiration' ? 'red' :
a === 'reinstantiation' ? 'purple' :
a === 'enum validation expiration' ? 'red' : 'default'
export const actionToIcon = (a: EventAction) => a === 'registration' ?
<SignatureOutlined style={{fontSize: '16px'}}/> : a === 'expiration' ?
<ClockCircleOutlined style={{fontSize: '16px'}}/> : a === 'transfer' ?
<ShareAltOutlined style={{fontSize: '16px'}}/> : a === 'last changed' ?
<SyncOutlined style={{fontSize: '16px'}}/> : a === 'deletion' ?
<DeleteOutlined style={{fontSize: '16px'}}/> : a === 'reregistration' ?
<ReloadOutlined style={{fontSize: '16px'}}/> : a === 'locked' ?
<LockOutlined style={{fontSize: '16px'}}/> : a === 'unlocked' ?
<UnlockOutlined style={{fontSize: '16px'}}/> : a === 'registrar expiration' ?
<ClockCircleOutlined
style={{fontSize: '16px'}}/> : a === 'enum validation expiration' ?
<ClockCircleOutlined style={{fontSize: '16px'}}/> : a === 'reinstantiation' ?
<ReloadOutlined style={{fontSize: '16px'}}/> : undefined
export const entityToName = (e: { entity: Entity }): string => {
if (e.entity.jCard.length === 0) return e.entity.handle
const jCard = vCard.fromJSON(e.entity.jCard)
let name = e.entity.handle
if (jCard.data.fn && !Array.isArray(jCard.data.fn) && jCard.data.fn.valueOf() !== '') name = jCard.data.fn.valueOf()
return name
}
export const sortDomainEntities = (domain: Domain) => domain.entities.sort((e1, e2) => {
const p = (r: string[]) => r.includes('registrant') ? 5 :
r.includes('administrative') ? 4 :
r.includes('billing') ? 3 :
r.includes('registrar') ? 2 : 1
return p(e2.roles) - p(e1.roles)
})
export function showErrorAPI(e: AxiosError, messageApi: MessageInstance): MessageType | undefined {
const response = e.response as AxiosResponse
const data = response.data
if ('message' in data) {
return messageApi.error(data.message as string)
}
if (!('detail' in data)) return
const detail = data.detail as string
if (response.status === 429) {
const duration = response.headers['retry-after']
return messageApi.error(t`Please retry after ${duration} seconds`)
}
if (response.status.toString()[0] === '4') {
return messageApi.warning(detail !== '' ? detail : t`An error occurred`)
}
return messageApi.error(detail !== '' ? detail : t`An error occurred`)
}

View File

@@ -3,15 +3,15 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n"
#: assets/components/LoginForm.tsx:51 #: assets/components/LoginForm.tsx:52
#: assets/components/RegisterForm.tsx:38 #: assets/components/RegisterForm.tsx:39
msgid "Email address" msgid "Email address"
msgstr "" msgstr ""
#: assets/components/LoginForm.tsx:53 #: assets/components/LoginForm.tsx:54
#: assets/components/LoginForm.tsx:61 #: assets/components/LoginForm.tsx:62
#: assets/components/RegisterForm.tsx:40 #: assets/components/RegisterForm.tsx:41
#: assets/components/RegisterForm.tsx:48 #: assets/components/RegisterForm.tsx:49
#: assets/components/search/DomainSearchBar.tsx:22 #: assets/components/search/DomainSearchBar.tsx:22
#: assets/components/tracking/connector/ConnectorForm.tsx:43 #: assets/components/tracking/connector/ConnectorForm.tsx:43
#: assets/components/tracking/connector/ConnectorForm.tsx:69 #: assets/components/tracking/connector/ConnectorForm.tsx:69
@@ -22,21 +22,21 @@ msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:142 #: assets/components/tracking/connector/ConnectorForm.tsx:142
#: assets/components/tracking/connector/ConnectorForm.tsx:156 #: assets/components/tracking/connector/ConnectorForm.tsx:156
#: assets/components/tracking/connector/ConnectorForm.tsx:165 #: assets/components/tracking/connector/ConnectorForm.tsx:165
#: assets/components/tracking/watchlist/WatchlistForm.tsx:114 #: assets/components/tracking/watchlist/WatchlistForm.tsx:115
#: assets/components/tracking/watchlist/WatchlistForm.tsx:211 #: assets/components/tracking/watchlist/WatchlistForm.tsx:212
msgid "Required" msgid "Required"
msgstr "" msgstr ""
#: assets/components/LoginForm.tsx:59 #: assets/components/LoginForm.tsx:60
#: assets/components/RegisterForm.tsx:46 #: assets/components/RegisterForm.tsx:47
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: assets/components/LoginForm.tsx:69 #: assets/components/LoginForm.tsx:70
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: assets/components/LoginForm.tsx:74 #: assets/components/LoginForm.tsx:75
msgid "Log in with SSO" msgid "Log in with SSO"
msgstr "" msgstr ""
@@ -456,20 +456,20 @@ msgid ""
"registry." "registry."
msgstr "" msgstr ""
#: assets/components/search/DomainResult.tsx:28 #: assets/components/search/DomainResult.tsx:39
msgid "EPP Status Codes" msgid "EPP Status Codes"
msgstr "" msgstr ""
#: assets/components/search/DomainResult.tsx:42 #: assets/components/search/DomainResult.tsx:53
msgid "Timeline" msgid "Timeline"
msgstr "" msgstr ""
#: assets/components/search/DomainResult.tsx:47 #: assets/components/search/DomainResult.tsx:58
msgid "Entities" msgid "Entities"
msgstr "" msgstr ""
#: assets/components/search/DomainSearchBar.tsx:25 #: assets/components/search/DomainSearchBar.tsx:25
#: assets/components/tracking/watchlist/WatchlistForm.tsx:117 #: assets/components/tracking/watchlist/WatchlistForm.tsx:118
msgid "This domain name does not appear to be valid" msgid "This domain name does not appear to be valid"
msgstr "" msgstr ""
@@ -544,12 +544,12 @@ msgid ""
msgstr "" msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:176 #: assets/components/tracking/connector/ConnectorForm.tsx:176
#: assets/components/tracking/watchlist/WatchlistForm.tsx:251 #: assets/components/tracking/watchlist/WatchlistForm.tsx:252
msgid "Create" msgid "Create"
msgstr "" msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:179 #: assets/components/tracking/connector/ConnectorForm.tsx:179
#: assets/components/tracking/watchlist/WatchlistForm.tsx:254 #: assets/components/tracking/watchlist/WatchlistForm.tsx:255
msgid "Reset" msgid "Reset"
msgstr "" msgstr ""
@@ -582,72 +582,72 @@ msgstr ""
msgid "No" msgid "No"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:71 #: assets/components/tracking/watchlist/WatchlistForm.tsx:72
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:82 #: assets/components/tracking/watchlist/WatchlistForm.tsx:83
msgid "Watchlist Name" msgid "Watchlist Name"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:83 #: assets/components/tracking/watchlist/WatchlistForm.tsx:84
msgid "Naming the Watchlist makes it easier to find in the list below." msgid "Naming the Watchlist makes it easier to find in the list below."
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:94 #: assets/components/tracking/watchlist/WatchlistForm.tsx:95
msgid "At least one domain name" msgid "At least one domain name"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistCard.tsx:28 #: assets/components/tracking/watchlist/WatchlistCard.tsx:29
#: assets/components/tracking/watchlist/WatchlistForm.tsx:105 #: assets/components/tracking/watchlist/WatchlistForm.tsx:106
msgid "Domain names" msgid "Domain names"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:123 #: assets/components/tracking/watchlist/WatchlistForm.tsx:124
msgid "Domain name" msgid "Domain name"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:140 #: assets/components/tracking/watchlist/WatchlistForm.tsx:141
msgid "Add a Domain name" msgid "Add a Domain name"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistCard.tsx:32 #: assets/components/tracking/watchlist/WatchlistCard.tsx:33
#: assets/components/tracking/watchlist/WatchlistForm.tsx:147 #: assets/components/tracking/watchlist/WatchlistForm.tsx:148
msgid "Tracked events" msgid "Tracked events"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:149 #: assets/components/tracking/watchlist/WatchlistForm.tsx:150
msgid "At least one trigger" msgid "At least one trigger"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:172 #: assets/components/tracking/watchlist/WatchlistForm.tsx:173
#: assets/components/tracking/watchlist/WatchlistForm.tsx:186 #: assets/components/tracking/watchlist/WatchlistForm.tsx:187
msgid "Connector" msgid "Connector"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:182 #: assets/components/tracking/watchlist/WatchlistForm.tsx:183
msgid "" msgid ""
"Please make sure the connector information is valid to purchase a domain " "Please make sure the connector information is valid to purchase a domain "
"that may be available soon." "that may be available soon."
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:202 #: assets/components/tracking/watchlist/WatchlistForm.tsx:203
msgid "DSN" msgid "DSN"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:214 #: assets/components/tracking/watchlist/WatchlistForm.tsx:215
msgid "This DSN does not appear to be valid" msgid "This DSN does not appear to be valid"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:232 #: assets/components/tracking/watchlist/WatchlistForm.tsx:233
msgid "Check out this link to the Symfony documentation to help you build the DSN" msgid "Check out this link to the Symfony documentation to help you build the DSN"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:241 #: assets/components/tracking/watchlist/WatchlistForm.tsx:242
msgid "Add a Webhook" msgid "Add a Webhook"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:251 #: assets/components/tracking/watchlist/WatchlistForm.tsx:252
msgid "Update" msgid "Update"
msgstr "" msgstr ""
@@ -671,11 +671,11 @@ msgstr ""
msgid "Watchlist Entity Diagram" msgid "Watchlist Entity Diagram"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/diagram/watchlistToEdges.tsx:36 #: assets/components/tracking/watchlist/diagram/watchlistToEdges.tsx:37
msgid "Registry" msgid "Registry"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/diagram/watchlistToNodes.tsx:29 #: assets/components/tracking/watchlist/diagram/watchlistToNodes.tsx:30
#, javascript-format #, javascript-format
msgid ".${ tld.tld } Registry" msgid ".${ tld.tld } Registry"
msgstr "" msgstr ""
@@ -697,11 +697,11 @@ msgstr ""
msgid "Are you sure to delete this Watchlist?" msgid "Are you sure to delete this Watchlist?"
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistCard.tsx:45 #: assets/components/tracking/watchlist/WatchlistCard.tsx:46
msgid "This Watchlist is not linked to a Connector." msgid "This Watchlist is not linked to a Connector."
msgstr "" msgstr ""
#: assets/components/tracking/watchlist/WatchlistCard.tsx:48 #: assets/components/tracking/watchlist/WatchlistCard.tsx:49
msgid "Watchlist" msgid "Watchlist"
msgstr "" msgstr ""
@@ -722,7 +722,7 @@ msgid "Domain Finder"
msgstr "" msgstr ""
#: assets/components/Sider.tsx:48 #: assets/components/Sider.tsx:48
#: assets/pages/info/TldPage.tsx:79 #: assets/pages/info/TldPage.tsx:65
msgid "TLD" msgid "TLD"
msgstr "" msgstr ""
@@ -777,7 +777,7 @@ msgstr ""
msgid "Log in" msgid "Log in"
msgstr "" msgstr ""
#: assets/components/RegisterForm.tsx:55 #: assets/components/RegisterForm.tsx:56
#: assets/pages/LoginPage.tsx:25 #: assets/pages/LoginPage.tsx:25
msgid "Register" msgid "Register"
msgstr "" msgstr ""
@@ -796,23 +796,23 @@ msgid ""
"WHOIS by its registrar." "WHOIS by its registrar."
msgstr "" msgstr ""
#: assets/pages/info/TldPage.tsx:85 #: assets/pages/info/TldPage.tsx:71
msgid "Flag" msgid "Flag"
msgstr "" msgstr ""
#: assets/pages/info/TldPage.tsx:88 #: assets/pages/info/TldPage.tsx:74
msgid "Country" msgid "Country"
msgstr "" msgstr ""
#: assets/pages/info/TldPage.tsx:93 #: assets/pages/info/TldPage.tsx:79
msgid "Registry Operator" msgid "Registry Operator"
msgstr "" msgstr ""
#: assets/pages/info/TldPage.tsx:120 #: assets/pages/info/TldPage.tsx:106
msgid "This page presents all active TLDs in the root zone database." msgid "This page presents all active TLDs in the root zone database."
msgstr "" msgstr ""
#: assets/pages/info/TldPage.tsx:123 #: assets/pages/info/TldPage.tsx:109
msgid "" msgid ""
"IANA provides the list of currently active TLDs, regardless of their type, " "IANA provides the list of currently active TLDs, regardless of their type, "
"and ICANN provides the list of gTLDs.\n" "and ICANN provides the list of gTLDs.\n"
@@ -824,42 +824,42 @@ msgid ""
"At the same time, the list of root RDAP servers is updated." "At the same time, the list of root RDAP servers is updated."
msgstr "" msgstr ""
#: assets/pages/info/TldPage.tsx:134 #: assets/pages/info/TldPage.tsx:120
msgid "Sponsored Top-Level-Domains" msgid "Sponsored Top-Level-Domains"
msgstr "" msgstr ""
#: assets/pages/info/TldPage.tsx:136 #: assets/pages/info/TldPage.tsx:122
msgid "" msgid ""
"Top-level domains sponsored by specific organizations that set rules for " "Top-level domains sponsored by specific organizations that set rules for "
"registration and use, often related to particular interest groups or " "registration and use, often related to particular interest groups or "
"industries." "industries."
msgstr "" msgstr ""
#: assets/pages/info/TldPage.tsx:143 #: assets/pages/info/TldPage.tsx:129
msgid "Generic Top-Level-Domains" msgid "Generic Top-Level-Domains"
msgstr "" msgstr ""
#: assets/pages/info/TldPage.tsx:145 #: assets/pages/info/TldPage.tsx:131
msgid "" msgid ""
"Generic top-level domains open to everyone, not restricted by specific " "Generic top-level domains open to everyone, not restricted by specific "
"criteria, representing various themes or industries." "criteria, representing various themes or industries."
msgstr "" msgstr ""
#: assets/pages/info/TldPage.tsx:152 #: assets/pages/info/TldPage.tsx:138
msgid "Brand Generic Top-Level-Domains" msgid "Brand Generic Top-Level-Domains"
msgstr "" msgstr ""
#: assets/pages/info/TldPage.tsx:154 #: assets/pages/info/TldPage.tsx:140
msgid "" msgid ""
"Generic top-level domains associated with specific brands, allowing " "Generic top-level domains associated with specific brands, allowing "
"companies to use their own brand names as domains." "companies to use their own brand names as domains."
msgstr "" msgstr ""
#: assets/pages/info/TldPage.tsx:161 #: assets/pages/info/TldPage.tsx:147
msgid "Country-Code Top-Level-Domains" msgid "Country-Code Top-Level-Domains"
msgstr "" msgstr ""
#: assets/pages/info/TldPage.tsx:163 #: assets/pages/info/TldPage.tsx:149
msgid "" msgid ""
"Top-level domains based on country codes, identifying websites according to " "Top-level domains based on country codes, identifying websites according to "
"their country of origin." "their country of origin."
@@ -873,23 +873,23 @@ msgstr ""
msgid "Roles" msgid "Roles"
msgstr "" msgstr ""
#: assets/pages/tracking/ConnectorsPage.tsx:19 #: assets/pages/tracking/ConnectorsPage.tsx:20
msgid "Connector created !" msgid "Connector created !"
msgstr "" msgstr ""
#: assets/pages/tracking/ConnectorsPage.tsx:38 #: assets/pages/tracking/ConnectorsPage.tsx:39
msgid "Create a Connector" msgid "Create a Connector"
msgstr "" msgstr ""
#: assets/pages/tracking/WatchlistPage.tsx:64 #: assets/pages/tracking/WatchlistPage.tsx:65
msgid "Watchlist created !" msgid "Watchlist created !"
msgstr "" msgstr ""
#: assets/pages/tracking/WatchlistPage.tsx:76 #: assets/pages/tracking/WatchlistPage.tsx:77
msgid "Watchlist updated !" msgid "Watchlist updated !"
msgstr "" msgstr ""
#: assets/pages/tracking/WatchlistPage.tsx:100 #: assets/pages/tracking/WatchlistPage.tsx:101
msgid "Create a Watchlist" msgid "Create a Watchlist"
msgstr "" msgstr ""
@@ -901,6 +901,16 @@ msgstr ""
msgid "Create an account" msgid "Create an account"
msgstr "" msgstr ""
#: assets/utils/functions/showErrorAPI.tsx:19
#, javascript-format
msgid "Please retry after ${ duration } seconds"
msgstr ""
#: assets/utils/functions/showErrorAPI.tsx:23
#: assets/utils/functions/showErrorAPI.tsx:26
msgid "An error occurred"
msgstr ""
#: assets/utils/providers/index.tsx:11 #: assets/utils/providers/index.tsx:11
msgid "" msgid ""
"Retrieve a set of tokens from your customer account on the Provider's " "Retrieve a set of tokens from your customer account on the Provider's "
@@ -943,16 +953,6 @@ msgid ""
"another" "another"
msgstr "" msgstr ""
#: assets/utils/index.tsx:103
#, javascript-format
msgid "Please retry after ${ duration } seconds"
msgstr ""
#: assets/utils/index.tsx:107
#: assets/utils/index.tsx:110
msgid "An error occurred"
msgstr ""
#: assets/App.tsx:101 #: assets/App.tsx:101
msgid "TOS" msgid "TOS"
msgstr "" msgstr ""