Merge branch 'feat/connector-form'

This commit is contained in:
Maël Gangloff 2025-02-18 22:15:28 +01:00
commit f6a4b2f4a1
No known key found for this signature in database
GPG Key ID: 11FDC81C24A7F629
12 changed files with 696 additions and 565 deletions

View File

@ -1,302 +1,69 @@
import type {FormInstance} from 'antd'
import {Alert, Button, Checkbox, Form, Input, Popconfirm, Select, Space, Typography} from 'antd'
import React, {useState} from 'react'
import type { FormInstance, StepProps} from 'antd'
import {Card, Col, Row, Steps, Typography} from 'antd'
import type {Connector} from '../../../utils/api/connectors'
import {ConnectorProvider} from '../../../utils/api/connectors'
import {t} from 'ttag'
import {BankOutlined} from '@ant-design/icons'
import {
ovhEndpointList as ovhEndpointListFunction,
ovhFields as ovhFieldsFunction,
ovhPricingMode as ovhPricingModeFunction,
ovhSubsidiaryList as ovhSubsidiaryListFunction
} from '../../../utils/providers/ovh'
import {helpGetTokenLink, tosHyperlink} from '../../../utils/providers'
import React, {useState} from 'react'
import {t} from "ttag"
import {BankOutlined, UserOutlined} from "@ant-design/icons"
import {providersConfig} from "../../../utils/providers"
const formItemLayoutWithOutLabel = {
wrapperCol: {
xs: {span: 24, offset: 0},
sm: {span: 20, offset: 4}
}
}
export function ConnectorForm({form, onCreate}: { form: FormInstance, onCreate: (values: Connector) => void }) {
const [provider, setProvider] = useState<ConnectorProvider>()
const ovhFields = ovhFieldsFunction()
const ovhEndpointList = ovhEndpointListFunction()
const ovhSubsidiaryList = ovhSubsidiaryListFunction()
const ovhPricingMode = ovhPricingModeFunction()
const [open, setOpen] = useState(false)
const [ovhPricingModeValue, setOvhPricingModeValue] = useState<string | undefined>()
const [current, setCurrent] = useState(0)
const ProviderForm = provider !== undefined ? providersConfig[provider].form : undefined
const steps: StepProps[] = [
{
title: t`Registrar`,
icon: <BankOutlined/>,
},
{
title: t`Authentication`,
icon: <UserOutlined/>,
}
]
const next = () => {
setCurrent(current + 1)
}
return (
<Form
{...formItemLayoutWithOutLabel}
form={form}
layout='horizontal'
labelCol={{span: 6}}
wrapperCol={{span: 14}}
onFinish={onCreate}
>
<Form.Item
label={t`Provider`}
name='provider'
help={helpGetTokenLink(provider)}
rules={[{required: true, message: t`Required`}]}
>
<Select
allowClear
placeholder={t`Please select a Provider`}
suffixIcon={<BankOutlined/>}
options={Object.keys(ConnectorProvider).map((c) => ({
value: ConnectorProvider[c as keyof typeof ConnectorProvider],
label: (
<>
<BankOutlined/>{' '} {c}
</>
)
}))}
value={provider}
onChange={setProvider}
autoFocus
/>
</Form.Item>
{
provider !== undefined && <>
{
[ConnectorProvider.AutoDNS, ConnectorProvider['Name.com']].includes(provider) && <Alert
message={t`This provider does not provide a list of supported TLD. Please double check if the domain you want to register is supported.`}
type='warning'
style={{marginBottom: '2em'}}
/>
}
{
provider === ConnectorProvider.OVHcloud && <>
{
Object.keys(ovhFields).map(fieldName => <Form.Item
key={ovhFields[fieldName as keyof typeof ovhFields]}
label={ovhFields[fieldName as keyof typeof ovhFields]}
name={['authData', fieldName]}
rules={[{required: true, message: t`Required`}]}
>
<Input autoComplete='off'/>
</Form.Item>)
}
<Form.Item
label={t`OVH Endpoint`}
name={['authData', 'apiEndpoint']}
rules={[{required: true, message: t`Required`}]}
>
<Select options={ovhEndpointList} optionFilterProp='label'/>
</Form.Item>
<Form.Item
label={t`OVH subsidiary`}
name={['authData', 'ovhSubsidiary']}
rules={[{required: true, message: t`Required`}]}
>
<Select options={ovhSubsidiaryList} optionFilterProp='label'/>
</Form.Item>
<Form.Item
label={t`OVH pricing mode`}
name={['authData', 'pricingMode']}
rules={[{required: true, message: t`Required`}]}
>
<Popconfirm
title={t`Confirm pricing mode`}
description={t`Are you sure about this setting? This may result in additional charges from the API Provider`}
onCancel={() => {
form.resetFields(['authData'])
setOvhPricingModeValue(undefined)
setOpen(false)
}}
onConfirm={() => setOpen(false)}
open={open}
>
<Select
options={ovhPricingMode} optionFilterProp='label' value={ovhPricingModeValue}
onChange={(value: string) => {
setOvhPricingModeValue(value)
form.setFieldValue(['authData', 'pricingMode'], value)
if (value !== 'create-default') {
setOpen(true)
}
<>
<Steps current={current} items={steps} onChange={(c: number) => setCurrent(c)}/>
<div style={{padding: 20}}>
{current === 0 && (
<>
<h2>{t`Choose a registrar`}</h2>
<Row gutter={[16, 16]}>
{Object.keys(providersConfig).map((provider: string) => (
<Col key={provider as ConnectorProvider} span={8}>
<Card
hoverable
style={{textAlign: "center"}}
onClick={() => {
setProvider(provider as ConnectorProvider)
next()
}}
/>
</Popconfirm>
</Form.Item>
</>
}
{
provider === ConnectorProvider.Gandi && <>
<Form.Item
label={t`Personal Access Token (PAT)`}
name={['authData', 'token']}
rules={[{required: true, message: t`Required`}]}
>
<Input autoComplete='off'/>
</Form.Item>
<Form.Item
label={t`Organization sharing ID`}
name={['authData', 'sharingId']}
help={<Typography.Text
type='secondary'
>{t`It indicates the organization that will pay for the ordered product`}
</Typography.Text>}
required={false}
>
<Input autoComplete='off' placeholder='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'/>
</Form.Item>
</>
}
{
provider === ConnectorProvider.AutoDNS && <>
<br/>
<Form.Item
label={t`AutoDNS Username`}
name={['authData', 'username']}
help={<Typography.Text
type='secondary'
>{t`Attention: AutoDNS do not support 2-Factor Authentication on API Users for automated systems`}
</Typography.Text>}
rules={[{required: true, message: t`Required`}]}
>
<Input autoComplete='off' required/>
</Form.Item>
<Form.Item
label={t`AutoDNS Password`}
name={['authData', 'password']}
rules={[{required: true, message: t`Required`}]}
required
>
<Input.Password autoComplete='off' required placeholder=''/>
</Form.Item>
<Form.Item
label={t`Owner nic-handle`}
name={['authData', 'contactid']}
help={<Typography.Text
type='secondary'
>{t`The nic-handle of the domain name owner`}<a
href='https://cloud.autodns.com/contacts/domain'
>{t`You can get it from this page`}
</a>
</Typography.Text>}
rules={[{required: true, message: t`Required`}]}
required
>
<Input autoComplete='off' required placeholder=''/>
</Form.Item>
>
<div style={{fontSize: "3rem"}}><BankOutlined style={{color: 'lightblue'}}/>
</div>
<h3>{Object.keys(ConnectorProvider).find(p => ConnectorProvider[p as keyof typeof ConnectorProvider] === provider)}</h3>
</Card>
</Col>
))}
</Row>
</>
)}
<Form.Item
label={t`Context Value`}
name={['authData', 'context']}
help={<Typography.Text
type='secondary'
>{t`If you not sure, use the default value 4`}
</Typography.Text>}
required={false}
>
<Input autoComplete='off' required={false} placeholder='4'/>
</Form.Item>
<Form.Item
valuePropName='checked'
label={t`Owner confirmation`}
name={['authData', 'ownerConfirm']}
rules={[{required: true, message: t`Required`}]}
>
<Checkbox
required
>{t`Owner confirms his consent of domain order jobs`}
</Checkbox>
</Form.Item>
</>
}
{
provider === ConnectorProvider.Namecheap && <>
<Form.Item
label={t`Username`}
name={['authData', 'ApiUser']}
>
<Input autoComplete='off'/>
</Form.Item>
<Form.Item
label={t`API key`}
name={['authData', 'ApiKey']}
>
<Input autoComplete='off'/>
</Form.Item>
</>
}
{
provider === ConnectorProvider['Name.com'] && <>
<Form.Item
label={t`Username`}
name={['authData', 'username']}
>
<Input autoComplete='off'/>
</Form.Item>
<Form.Item
label={t`API key`}
name={['authData', 'token']}
>
<Input autoComplete='off'/>
</Form.Item>
</>
}
<Form.Item
valuePropName='checked'
label={t`API Terms of Service`}
name={['authData', 'acceptConditions']}
rules={[{required: true, message: t`Required`}]}
style={{marginTop: '3em'}}
>
<Checkbox
required
>
<Typography.Link target='_blank' href={tosHyperlink(provider)}>
{t`I have read and accepted the conditions of use of the Provider API, accessible from this hyperlink`}
</Typography.Link>
</Checkbox>
</Form.Item>
<Form.Item
valuePropName='checked'
label={t`Legal age`}
name={['authData', 'ownerLegalAge']}
rules={[{required: true, message: t`Required`}]}
>
<Checkbox
required
>{t`I am of the minimum age required to consent to these conditions`}
</Checkbox>
</Form.Item>
<Form.Item
valuePropName='checked'
label={t`Withdrawal period`}
name={['authData', 'waiveRetractationPeriod']}
rules={[{required: true, message: t`Required`}]}
>
<Checkbox
required
>{t`I waive my right of withdrawal regarding the purchase of domain names via the Provider's API`}
</Checkbox>
</Form.Item>
</>
}
<Form.Item style={{marginTop: '5vh'}}>
<Space>
<Button type='primary' htmlType='submit'>
{t`Create`}
</Button>
<Button type='default' htmlType='reset'>
{t`Reset`}
</Button>
</Space>
</Form.Item>
</Form>
{current === 1 && ProviderForm && <ProviderForm form={form} onCreate={onCreate}/>}
</div>
<Typography.Text type='secondary'>
{t`This website is neither affiliated with nor sponsored by the registrars mentioned.
The names and logos of these companies are used for informational purposes only and remain registered trademarks of their respective owners.
The use of their services via this website is subject to the terms and conditions set by each registrar and is the sole responsibility of the user.`}
</Typography.Text>
</>
)
}

View File

@ -4,8 +4,7 @@ import {DeleteFilled} from '@ant-design/icons'
import React from 'react'
import type {Connector} from '../../../utils/api/connectors'
import { ConnectorProvider, deleteConnector} from '../../../utils/api/connectors'
import {tosHyperlink} from "../../../utils/providers"
import {providersConfig} from "../../../utils/providers"
const {useToken} = theme
export type ConnectorElement = Connector & { id: string, createdAt: string, watchlistCount: number }
@ -51,7 +50,7 @@ export function ConnectorsList({connectors, onDelete}: { connectors: ConnectorEl
{t`You can stop using a connector at any time. To delete a connector, you must remove it from each linked Watchlist.
The creation date corresponds to the date on which you consented to the creation of the connector and on which you declared in particular that you fulfilled the conditions of use of the supplier's API, waived the right of withdrawal and were of the minimum age to consent to these conditions.`}
&nbsp;
<Typography.Link href={tosHyperlink(connector.provider)}>
<Typography.Link href={providersConfig[connector.provider].tosLink}>
{t`The Providers conditions are accessible by following this hyperlink.`}
</Typography.Link>
</>

View File

@ -8,6 +8,7 @@ import {rdapEventDetailTranslation, rdapEventNameTranslation} from '../../../uti
import {actionToColor} from '../../../utils/functions/actionToColor'
import {actionToIcon} from '../../../utils/functions/actionToIcon'
import type {EventAction} from '../../../utils/api'
import {formItemLayoutWithOutLabel} from "../../../utils/providers"
type TagRender = SelectProps['tagRender']
@ -22,13 +23,6 @@ const formItemLayout = {
}
}
const formItemLayoutWithOutLabel = {
wrapperCol: {
xs: {span: 24, offset: 0},
sm: {span: 20, offset: 4}
}
}
export function WatchlistForm({form, connectors, onFinish, isCreation}: {
form: FormInstance
connectors: Array<Connector & { id: string }>
@ -269,7 +263,7 @@ export function WatchlistForm({form, connectors, onFinish, isCreation}: {
</>
)}
</Form.List>
<Form.Item style={{marginTop: '5vh'}}>
<Form.Item style={{marginTop: '5em'}}>
<Space>
<Button type='primary' htmlType='submit'>
{isCreation ? t`Create` : t`Update`}

View File

@ -0,0 +1,96 @@
import type {FormInstance} from 'antd'
import {Alert, Checkbox, Form, Input, Typography} from 'antd'
import React from 'react'
import type {Connector} from '../../api/connectors'
import {ConnectorProvider} from '../../api/connectors'
import {t} from 'ttag'
import DefaultConnectorFormItems from "./DefaultConnectorFormItems"
import {formItemLayoutWithOutLabel, providersConfig} from "../index"
export default function AutoDnsConnectorForm({form, onCreate}: {
form: FormInstance,
onCreate: (values: Connector) => void
}) {
form.setFieldValue('provider', ConnectorProvider.AutoDNS)
return (
<Form
{...formItemLayoutWithOutLabel}
form={form}
layout='horizontal'
labelCol={{span: 6}}
wrapperCol={{span: 14}}
onFinish={onCreate}
>
<Alert
message={t`This provider does not provide a list of supported TLD. Please double check if the domain you want to register is supported.`}
type='warning'
style={{marginBottom: '2em'}}
/>
<br/>
<Form.Item
label={t`AutoDNS Username`}
name={['authData', 'username']}
help={<Typography.Text
type='secondary'
>{t`Attention: AutoDNS do not support 2-Factor Authentication on API Users for automated systems`}
</Typography.Text>}
rules={[{required: true, message: t`Required`}]}
>
<Input autoComplete='off' required/>
</Form.Item>
<Form.Item
label={t`AutoDNS Password`}
name={['authData', 'password']}
rules={[{required: true, message: t`Required`}]}
required
>
<Input.Password autoComplete='off' required placeholder=''/>
</Form.Item>
<Form.Item
label={t`Owner nic-handle`}
name={['authData', 'contactid']}
help={<Typography.Text
type='secondary'
>{t`The nic-handle of the domain name owner`}<a
href='https://cloud.autodns.com/contacts/domain'
>{t`You can get it from this page`}
</a>
</Typography.Text>}
rules={[{required: true, message: t`Required`}]}
required
>
<Input autoComplete='off' required placeholder=''/>
</Form.Item>
<Form.Item
label={t`Context Value`}
name={['authData', 'context']}
help={<Typography.Text
type='secondary'
>{t`If you not sure, use the default value 4`}
</Typography.Text>}
required={false}
>
<Input autoComplete='off' required={false} placeholder='4'/>
</Form.Item>
<Form.Item
valuePropName='checked'
label={t`Owner confirmation`}
name={['authData', 'ownerConfirm']}
rules={[{required: true, message: t`Required`}]}
>
<Checkbox
required
>{t`Owner confirms his consent of domain order jobs`}
</Checkbox>
</Form.Item>
<DefaultConnectorFormItems tosLink={providersConfig[ConnectorProvider.AutoDNS].tosLink}/>
</Form>
)
}

View File

@ -0,0 +1,56 @@
import {Button, Checkbox, Form, Input, Typography} from "antd"
import {t} from "ttag"
import React from "react"
export default function DefaultConnectorFormItems({tosLink}: { tosLink: string }) {
return <>
<Form.Item name="provider" noStyle>
<Input type="hidden" />
</Form.Item>
<Form.Item
valuePropName='checked'
label={t`API Terms of Service`}
name={['authData', 'acceptConditions']}
rules={[{required: true, message: t`Required`}]}
style={{marginTop: '3em'}}
>
<Checkbox
required
>
<Typography.Link target='_blank' href={tosLink}>
{t`I have read and accepted the conditions of use of the Provider API, accessible from this hyperlink`}
</Typography.Link>
</Checkbox>
</Form.Item>
<Form.Item
valuePropName='checked'
label={t`Legal age`}
name={['authData', 'ownerLegalAge']}
rules={[{required: true, message: t`Required`}]}
>
<Checkbox
required
>{t`I am of the minimum age required to consent to these conditions`}
</Checkbox>
</Form.Item>
<Form.Item
valuePropName='checked'
label={t`Withdrawal period`}
name={['authData', 'waiveRetractationPeriod']}
rules={[{required: true, message: t`Required`}]}
>
<Checkbox
required
>{t`I waive my right of withdrawal regarding the purchase of domain names via the Provider's API`}
</Checkbox>
</Form.Item>
<Form.Item style={{marginTop: '2em', textAlign: 'center'}}>
<Button type='primary' htmlType='submit'>
{t`Create`}
</Button>
</Form.Item>
</>
}

View File

@ -0,0 +1,48 @@
import type {FormInstance} from 'antd'
import {Form, Input, Typography} from 'antd'
import React from 'react'
import type {Connector} from '../../api/connectors'
import {ConnectorProvider} from '../../api/connectors'
import {t} from 'ttag'
import DefaultConnectorFormItems from "./DefaultConnectorFormItems"
import {formItemLayoutWithOutLabel, providersConfig} from "../index"
export default function GandiConnectorForm({form, onCreate}: {
form: FormInstance,
onCreate: (values: Connector) => void
}) {
form.setFieldValue('provider', ConnectorProvider.Gandi)
return (
<Form
{...formItemLayoutWithOutLabel}
form={form}
layout='horizontal'
labelCol={{span: 6}}
wrapperCol={{span: 14}}
onFinish={onCreate}
>
<Form.Item
label={t`Personal Access Token (PAT)`}
name={['authData', 'token']}
rules={[{required: true, message: t`Required`}]}
>
<Input autoComplete='off'/>
</Form.Item>
<Form.Item
label={t`Organization sharing ID`}
name={['authData', 'sharingId']}
help={<Typography.Text
type='secondary'
>{t`It indicates the organization that will pay for the ordered product`}
</Typography.Text>}
required={false}
>
<Input autoComplete='off' placeholder='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'/>
</Form.Item>
<DefaultConnectorFormItems tosLink={providersConfig[ConnectorProvider.Gandi].tosLink}/>
</Form>
)
}

View File

@ -0,0 +1,42 @@
import type {FormInstance} from 'antd'
import {Form, Input} from 'antd'
import React from 'react'
import type {Connector} from '../../api/connectors'
import {ConnectorProvider} from '../../api/connectors'
import {t} from 'ttag'
import DefaultConnectorFormItems from "./DefaultConnectorFormItems"
import {formItemLayoutWithOutLabel, providersConfig} from "../index"
export default function NamecheapConnectorForm({form, onCreate}: {
form: FormInstance,
onCreate: (values: Connector) => void
}) {
form.setFieldValue('provider', ConnectorProvider.Namecheap)
return (
<Form
{...formItemLayoutWithOutLabel}
form={form}
layout='horizontal'
labelCol={{span: 6}}
wrapperCol={{span: 14}}
onFinish={onCreate}
>
<Form.Item
label={t`Username`}
name={['authData', 'ApiUser']}
>
<Input autoComplete='off'/>
</Form.Item>
<Form.Item
label={t`API key`}
name={['authData', 'ApiKey']}
>
<Input autoComplete='off'/>
</Form.Item>
<DefaultConnectorFormItems tosLink={providersConfig[ConnectorProvider.Namecheap].tosLink}/>
</Form>
)
}

View File

@ -0,0 +1,46 @@
import type {FormInstance} from 'antd'
import {Alert, Form, Input} from 'antd'
import React from 'react'
import type {Connector} from '../../api/connectors'
import {ConnectorProvider} from '../../api/connectors'
import {t} from 'ttag'
import DefaultConnectorFormItems from "./DefaultConnectorFormItems"
import {formItemLayoutWithOutLabel, providersConfig} from "../index"
export default function NamecomConnectorForm({form, onCreate}: {
form: FormInstance,
onCreate: (values: Connector) => void
}) {
form.setFieldValue('provider', ConnectorProvider["Name.com"])
return (
<Form
{...formItemLayoutWithOutLabel}
form={form}
layout='horizontal'
labelCol={{span: 6}}
wrapperCol={{span: 14}}
onFinish={onCreate}
>
<Alert
message={t`This provider does not provide a list of supported TLD. Please double check if the domain you want to register is supported.`}
type='warning'
style={{marginBottom: '2em'}}
/>
<Form.Item
label={t`Username`}
name={['authData', 'username']}
>
<Input autoComplete='off'/>
</Form.Item>
<Form.Item
label={t`API key`}
name={['authData', 'token']}
>
<Input autoComplete='off'/>
</Form.Item>
<DefaultConnectorFormItems tosLink={providersConfig[ConnectorProvider["Name.com"]].tosLink}/>
</Form>
)
}

View File

@ -0,0 +1,125 @@
import {t} from 'ttag'
import {regionNames} from "../../../i18n"
import React, {useState} from 'react'
import type {FormInstance} from "antd"
import {Form, Input, Popconfirm, Select} from "antd"
import type {Connector} from "../../api/connectors"
import {ConnectorProvider} from "../../api/connectors"
import DefaultConnectorFormItems from "./DefaultConnectorFormItems"
import {formItemLayoutWithOutLabel, providersConfig} from "../index"
export default function OvhCloudConnectorForm({form, onCreate}: {
form: FormInstance,
onCreate: (values: Connector) => void
}) {
const [open, setOpen] = useState(false)
const [ovhPricingModeValue, setOvhPricingModeValue] = useState<string | undefined>()
form.setFieldValue('provider', ConnectorProvider.OVHcloud)
const ovhEndpointList = [
{label: t`European Region`, value: 'ovh-eu'},
{label: t`United States Region`, value: 'ovh-us'},
{label: t`Canada Region`, value: 'ovh-ca'}
]
const ovhSubsidiaryList = [...[
'CZ', 'DE', 'ES', 'FI', 'FR', 'GB', 'IE', 'IT', 'LT', 'MA', 'NL', 'PL', 'PT', 'SN', 'TN'
].map(c => ({value: c, label: regionNames.of(c) ?? c})), {value: 'EU', label: t`Europe`}]
const ovhPricingMode = [
{value: 'create-default', label: t`The domain is free and at the standard price`},
{
value: 'create-premium',
label: t`The domain is free but can be premium. Its price varies from one domain to another`
}
]
return (
<Form
{...formItemLayoutWithOutLabel}
form={form}
layout='horizontal'
labelCol={{span: 6}}
wrapperCol={{span: 14}}
onFinish={onCreate}
>
<Form.Item
label={t`Application key`}
name={['authData', 'appKey']}
rules={[{required: true, message: t`Required`}]}
>
<Input autoComplete='off'/>
</Form.Item>
<Form.Item
label={t`Application secret`}
name={['authData', 'appSecret']}
rules={[{required: true, message: t`Required`}]}
>
<Input autoComplete='off'/>
</Form.Item>
<Form.Item
label={t`Consumer key`}
name={['authData', 'consumerKey']}
rules={[{required: true, message: t`Required`}]}
>
<Input autoComplete='off'/>
</Form.Item>
<Form.Item
label={t`Application key`}
name={['authData', 'appKey']}
rules={[{required: true, message: t`Required`}]}
>
<Input autoComplete='off'/>
</Form.Item>
<Form.Item
label={t`OVH Endpoint`}
name={['authData', 'apiEndpoint']}
rules={[{required: true, message: t`Required`}]}
>
<Select options={ovhEndpointList} optionFilterProp='label'/>
</Form.Item>
<Form.Item
label={t`OVH subsidiary`}
name={['authData', 'ovhSubsidiary']}
rules={[{required: true, message: t`Required`}]}
>
<Select options={ovhSubsidiaryList} optionFilterProp='label'/>
</Form.Item>
<Form.Item
label={t`OVH pricing mode`}
name={['authData', 'pricingMode']}
rules={[{required: true, message: t`Required`}]}
>
<Popconfirm
title={t`Confirm pricing mode`}
description={t`Are you sure about this setting? This may result in additional charges from the API Provider`}
onCancel={() => {
form.resetFields(['authData'])
setOvhPricingModeValue(undefined)
setOpen(false)
}}
onConfirm={() => setOpen(false)}
open={open}
>
<Select
options={ovhPricingMode} optionFilterProp='label' value={ovhPricingModeValue}
onChange={(value: string) => {
setOvhPricingModeValue(value)
form.setFieldValue(['authData', 'pricingMode'], value)
if (value !== 'create-default') {
setOpen(true)
}
}}
/>
</Popconfirm>
</Form.Item>
<DefaultConnectorFormItems tosLink={providersConfig[ConnectorProvider.OVHcloud].tosLink}/>
</Form>
)
}

View File

@ -1,62 +1,50 @@
import type {Connector} from '../api/connectors'
import {ConnectorProvider} from '../api/connectors'
import {Typography} from 'antd'
import {t} from 'ttag'
import React from 'react'
import OvhCloudConnectorForm from "./forms/OvhCloudConnectorForm"
import type {FormInstance} from "antd"
import type React from "react"
import GandiConnectorForm from "./forms/GandiConnectorForm"
import NamecheapConnectorForm from "./forms/NamecheapConnectorForm"
import AutoDnsConnectorForm from "./forms/AutoDnsConnectorForm"
import NamecomConnectorForm from "./forms/NamecomConnectorForm"
export const helpGetTokenLink = (provider?: string) => {
switch (provider) {
case ConnectorProvider.OVHcloud:
return (
<Typography.Link
target='_blank'
href='https://api.ovh.com/createToken/?GET=/order/cart&GET=/order/cart/*&POST=/order/cart&POST=/order/cart/*&DELETE=/order/cart/*&GET=/domain/extensions'
>
{t`Retrieve a set of tokens from your customer account on the Provider's website`}
</Typography.Link>
)
case ConnectorProvider.Gandi:
return (
<Typography.Link target='_blank' href='https://admin.gandi.net/organizations/account/pat'>
{t`Retrieve a Personal Access Token from your customer account on the Provider's website`}
</Typography.Link>
)
case ConnectorProvider.Namecheap:
return (
<Typography.Link target='_blank' href='https://ap.www.namecheap.com/settings/tools/apiaccess/'>
{t`Retreive an API key and whitelist this instance's IP address on Namecheap's website`}
</Typography.Link>
)
case ConnectorProvider.AutoDNS:
return (
<Typography.Link target='_blank' href='https://en.autodns.com/domain-robot-api/'>
{t`Because of some limitations in API of AutoDNS, we suggest to create an dedicated user for API with limited rights`}
</Typography.Link>
)
case ConnectorProvider['Name.com']:
return (
<Typography.Link target='_blank' href='https://www.name.com/account/settings/api'>
{t`Retrieve a set of tokens from your customer account on the Provider's website`}
</Typography.Link>
)
default:
return <></>
export const formItemLayoutWithOutLabel = {
wrapperCol: {
xs: {span: 24, offset: 0},
sm: {span: 20, offset: 4}
}
}
export const tosHyperlink = (provider?: string) => {
switch (provider) {
case ConnectorProvider.OVHcloud:
return 'https://www.ovhcloud.com/en/terms-and-conditions/contracts/'
case ConnectorProvider.Gandi:
return 'https://www.gandi.net/en/contracts/terms-of-service'
case ConnectorProvider.Namecheap:
return 'https://www.namecheap.com/legal/universal/universal-tos/'
case ConnectorProvider.AutoDNS:
return 'https://www.internetx.com/agb/'
case ConnectorProvider['Name.com']:
return 'https://www.name.com/policies/'
default:
return ''
export type ProviderConfig = {
tosLink: string
tokenLink: string
form: ({form, onCreate}: { form: FormInstance, onCreate: (values: Connector) => void }) => React.ReactElement
}
export const providersConfig: Record<ConnectorProvider, ProviderConfig> = {
[ConnectorProvider.OVHcloud]: {
tosLink: 'https://www.ovhcloud.com/en/terms-and-conditions/contracts/',
tokenLink: 'https://api.ovh.com/createToken/?GET=/order/cart&GET=/order/cart/*&POST=/order/cart&POST=/order/cart/*&DELETE=/order/cart/*&GET=/domain/extensions',
form: OvhCloudConnectorForm
},
[ConnectorProvider.Gandi]: {
tosLink: 'https://www.gandi.net/en/contracts/terms-of-service',
tokenLink: 'https://admin.gandi.net/organizations/account/pat',
form: GandiConnectorForm
},
[ConnectorProvider.Namecheap]: {
tosLink: 'https://www.namecheap.com/legal/universal/universal-tos/',
tokenLink: 'https://ap.www.namecheap.com/settings/tools/apiaccess/',
form: NamecheapConnectorForm
},
[ConnectorProvider.AutoDNS]: {
tosLink: 'https://www.internetx.com/agb/',
tokenLink: 'https://en.autodns.com/domain-robot-api/',
form: AutoDnsConnectorForm
},
[ConnectorProvider["Name.com"]]: {
tosLink: 'https://www.name.com/policies/',
tokenLink: 'https://www.name.com/account/settings/api',
form: NamecomConnectorForm
}
}

View File

@ -1,27 +0,0 @@
import {t} from 'ttag'
import {regionNames} from '../../i18n'
export const ovhFields = () => ({
appKey: t`Application key`,
appSecret: t`Application secret`,
consumerKey: t`Consumer key`
})
export const ovhEndpointList = () => [
{
label: t`European Region`,
value: 'ovh-eu'
}
]
export const ovhSubsidiaryList = () => [...[
'CZ', 'DE', 'ES', 'FI', 'FR', 'GB', 'IE', 'IT', 'LT', 'MA', 'NL', 'PL', 'PT', 'SN', 'TN'
].map(c => ({value: c, label: regionNames.of(c) ?? c})), {value: 'EU', label: t`Europe`}]
export const ovhPricingMode = () => [
{value: 'create-default', label: t`The domain is free and at the standard price`},
{
value: 'create-premium',
label: t`The domain is free but can be premium. Its price varies from one domain to another`
}
]

View File

@ -44,21 +44,23 @@ msgstr ""
#: assets/components/RegisterForm.tsx:39
#: assets/components/RegisterForm.tsx:47
#: assets/components/search/DomainSearchBar.tsx:28
#: assets/components/tracking/connector/ConnectorForm.tsx:45
#: assets/components/tracking/connector/ConnectorForm.tsx:81
#: assets/components/tracking/connector/ConnectorForm.tsx:89
#: assets/components/tracking/connector/ConnectorForm.tsx:96
#: assets/components/tracking/connector/ConnectorForm.tsx:104
#: assets/components/tracking/connector/ConnectorForm.tsx:136
#: assets/components/tracking/connector/ConnectorForm.tsx:163
#: assets/components/tracking/connector/ConnectorForm.tsx:170
#: assets/components/tracking/connector/ConnectorForm.tsx:185
#: assets/components/tracking/connector/ConnectorForm.tsx:208
#: assets/components/tracking/connector/ConnectorForm.tsx:254
#: assets/components/tracking/connector/ConnectorForm.tsx:269
#: assets/components/tracking/connector/ConnectorForm.tsx:280
#: assets/components/tracking/watchlist/WatchlistForm.tsx:125
#: assets/components/tracking/watchlist/WatchlistForm.tsx:228
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:40
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:47
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:62
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:85
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:15
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:30
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:41
#: assets/utils/providers/forms/GandiConnectorForm.tsx:36
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:50
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:58
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:66
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:74
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:82
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:89
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:97
msgid "Required"
msgstr ""
@ -219,185 +221,69 @@ msgstr ""
msgid "Log in"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:42
msgid "Provider"
#: assets/components/tracking/connector/ConnectorForm.tsx:19
#: assets/utils/functions/rdapTranslation.ts:12
msgid "Registrar"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:49
msgid "Please select a Provider"
#: assets/components/tracking/connector/ConnectorForm.tsx:23
msgid "Authentication"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:69
#: assets/components/tracking/connector/ConnectorForm.tsx:38
msgid "Choose a registrar"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:63
msgid ""
"This provider does not provide a list of supported TLD. Please double check "
"if the domain you want to register is supported."
"This website is neither affiliated with nor sponsored by the registrars "
"mentioned.\n"
"The names and logos of these companies are used for informational purposes "
"only and remain registered trademarks of their respective owners.\n"
"The use of their services via this website is subject to the terms and "
"conditions set by each registrar and is the sole responsibility of the user."
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:87
msgid "OVH Endpoint"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:94
msgid "OVH subsidiary"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:102
msgid "OVH pricing mode"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:107
msgid "Confirm pricing mode"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:108
msgid ""
"Are you sure about this setting? This may result in additional charges from "
"the API Provider"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:134
msgid "Personal Access Token (PAT)"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:141
msgid "Organization sharing ID"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:145
msgid "It indicates the organization that will pay for the ordered product"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:157
msgid "AutoDNS Username"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:161
msgid ""
"Attention: AutoDNS do not support 2-Factor Authentication on API Users for "
"automated systems"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:168
msgid "AutoDNS Password"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:176
msgid "Owner nic-handle"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:180
msgid "The nic-handle of the domain name owner"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:182
msgid "You can get it from this page"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:192
msgid "Context Value"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:196
msgid "If you not sure, use the default value 4"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:205
msgid "Owner confirmation"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:212
msgid "Owner confirms his consent of domain order jobs"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:221
#: assets/components/tracking/connector/ConnectorForm.tsx:237
#: assets/pages/UserPage.tsx:19
msgid "Username"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:227
#: assets/components/tracking/connector/ConnectorForm.tsx:243
msgid "API key"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:252
msgid "API Terms of Service"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:261
msgid ""
"I have read and accepted the conditions of use of the Provider API, "
"accessible from this hyperlink"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:267
msgid "Legal age"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:273
msgid "I am of the minimum age required to consent to these conditions"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:278
msgid "Withdrawal period"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:284
msgid ""
"I waive my right of withdrawal regarding the purchase of domain names via "
"the Provider's API"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:293
#: assets/components/tracking/watchlist/WatchlistForm.tsx:275
msgid "Create"
msgstr ""
#: assets/components/tracking/connector/ConnectorForm.tsx:296
#: assets/components/tracking/watchlist/WatchlistForm.tsx:278
msgid "Reset"
msgstr ""
#: assets/components/tracking/connector/ConnectorsList.tsx:19
#: assets/components/tracking/connector/ConnectorsList.tsx:18
msgid ""
"An error occurred while deleting the Connector. Make sure it is not used in "
"any Watchlist"
msgstr ""
#: assets/components/tracking/connector/ConnectorsList.tsx:34
#: assets/components/tracking/connector/ConnectorsList.tsx:33
#, javascript-format
msgid "Connector ${ connectorName }"
msgstr ""
#: assets/components/tracking/connector/ConnectorsList.tsx:39
#: assets/components/tracking/connector/ConnectorsList.tsx:38
msgid "Delete the Connector"
msgstr ""
#: assets/components/tracking/connector/ConnectorsList.tsx:40
#: assets/components/tracking/connector/ConnectorsList.tsx:39
msgid "Are you sure to delete this Connector?"
msgstr ""
#: assets/components/tracking/connector/ConnectorsList.tsx:42
#: assets/components/tracking/connector/ConnectorsList.tsx:41
#: assets/components/tracking/watchlist/DeleteWatchlistButton.tsx:16
msgid "Yes"
msgstr ""
#: assets/components/tracking/connector/ConnectorsList.tsx:43
#: assets/components/tracking/connector/ConnectorsList.tsx:42
#: assets/components/tracking/watchlist/DeleteWatchlistButton.tsx:17
msgid "No"
msgstr ""
#: assets/components/tracking/connector/ConnectorsList.tsx:47
#: assets/components/tracking/connector/ConnectorsList.tsx:46
#, javascript-format
msgid "Creation date: ${ createdAt }"
msgstr ""
#: assets/components/tracking/connector/ConnectorsList.tsx:48
#: assets/components/tracking/connector/ConnectorsList.tsx:47
#, javascript-format
msgid "Used in: ${ watchlistCount } Watchlist"
msgstr ""
#: assets/components/tracking/connector/ConnectorsList.tsx:51
#: assets/components/tracking/connector/ConnectorsList.tsx:50
msgid ""
"You can stop using a connector at any time. To delete a connector, you must "
"remove it from each linked Watchlist.\n"
@ -407,7 +293,7 @@ msgid ""
"withdrawal and were of the minimum age to consent to these conditions."
msgstr ""
#: assets/components/tracking/connector/ConnectorsList.tsx:55
#: assets/components/tracking/connector/ConnectorsList.tsx:54
msgid "The Providers conditions are accessible by following this hyperlink."
msgstr ""
@ -587,10 +473,19 @@ msgstr ""
msgid "Add a Webhook"
msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:275
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:52
msgid "Create"
msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:275
msgid "Update"
msgstr ""
#: assets/components/tracking/watchlist/WatchlistForm.tsx:278
msgid "Reset"
msgstr ""
#: assets/pages/LoginPage.tsx:45
msgid "Create an account"
msgstr ""
@ -733,6 +628,12 @@ msgstr ""
msgid "Create a Watchlist"
msgstr ""
#: assets/pages/UserPage.tsx:19
#: assets/utils/providers/forms/NamecheapConnectorForm.tsx:28
#: assets/utils/providers/forms/NamecomConnectorForm.tsx:32
msgid "Username"
msgstr ""
#: assets/pages/UserPage.tsx:22
msgid "Roles"
msgstr ""
@ -757,10 +658,6 @@ msgstr ""
msgid "Billing"
msgstr ""
#: assets/utils/functions/rdapTranslation.ts:12
msgid "Registrar"
msgstr ""
#: assets/utils/functions/rdapTranslation.ts:13
msgid "Reseller"
msgstr ""
@ -1191,57 +1088,157 @@ msgstr ""
msgid "An error occurred"
msgstr ""
#: assets/utils/providers/index.tsx:14
#: assets/utils/providers/index.tsx:39
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:27
#: assets/utils/providers/forms/NamecomConnectorForm.tsx:27
msgid ""
"Retrieve a set of tokens from your customer account on the Provider's "
"website"
"This provider does not provide a list of supported TLD. Please double check "
"if the domain you want to register is supported."
msgstr ""
#: assets/utils/providers/index.tsx:21
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:34
msgid "AutoDNS Username"
msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:38
msgid ""
"Retrieve a Personal Access Token from your customer account on the "
"Provider's website"
"Attention: AutoDNS do not support 2-Factor Authentication on API Users for "
"automated systems"
msgstr ""
#: assets/utils/providers/index.tsx:27
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:45
msgid "AutoDNS Password"
msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:53
msgid "Owner nic-handle"
msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:57
msgid "The nic-handle of the domain name owner"
msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:59
msgid "You can get it from this page"
msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:69
msgid "Context Value"
msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:73
msgid "If you not sure, use the default value 4"
msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:82
msgid "Owner confirmation"
msgstr ""
#: assets/utils/providers/forms/AutoDnsConnectorForm.tsx:89
msgid "Owner confirms his consent of domain order jobs"
msgstr ""
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:13
msgid "API Terms of Service"
msgstr ""
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:22
msgid ""
"Retreive an API key and whitelist this instance's IP address on Namecheap's "
"website"
"I have read and accepted the conditions of use of the Provider API, "
"accessible from this hyperlink"
msgstr ""
#: assets/utils/providers/index.tsx:33
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:28
msgid "Legal age"
msgstr ""
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:34
msgid "I am of the minimum age required to consent to these conditions"
msgstr ""
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:39
msgid "Withdrawal period"
msgstr ""
#: assets/utils/providers/forms/DefaultConnectorFormItems.tsx:45
msgid ""
"Because of some limitations in API of AutoDNS, we suggest to create an "
"dedicated user for API with limited rights"
"I waive my right of withdrawal regarding the purchase of domain names via "
"the Provider's API"
msgstr ""
#: assets/utils/providers/ovh.tsx:5
msgid "Application key"
#: assets/utils/providers/forms/GandiConnectorForm.tsx:34
msgid "Personal Access Token (PAT)"
msgstr ""
#: assets/utils/providers/ovh.tsx:6
msgid "Application secret"
#: assets/utils/providers/forms/GandiConnectorForm.tsx:41
msgid "Organization sharing ID"
msgstr ""
#: assets/utils/providers/ovh.tsx:7
msgid "Consumer key"
#: assets/utils/providers/forms/GandiConnectorForm.tsx:45
msgid "It indicates the organization that will pay for the ordered product"
msgstr ""
#: assets/utils/providers/ovh.tsx:12
#: assets/utils/providers/forms/NamecheapConnectorForm.tsx:34
#: assets/utils/providers/forms/NamecomConnectorForm.tsx:38
msgid "API key"
msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:21
msgid "European Region"
msgstr ""
#: assets/utils/providers/ovh.tsx:19
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:22
msgid "United States Region"
msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:23
msgid "Canada Region"
msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:28
msgid "Europe"
msgstr ""
#: assets/utils/providers/ovh.tsx:22
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:31
msgid "The domain is free and at the standard price"
msgstr ""
#: assets/utils/providers/ovh.tsx:25
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:34
msgid ""
"The domain is free but can be premium. Its price varies from one domain to "
"another"
msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:48
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:72
msgid "Application key"
msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:56
msgid "Application secret"
msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:64
msgid "Consumer key"
msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:80
msgid "OVH Endpoint"
msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:87
msgid "OVH subsidiary"
msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:95
msgid "OVH pricing mode"
msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:100
msgid "Confirm pricing mode"
msgstr ""
#: assets/utils/providers/forms/OvhCloudConnectorForm.tsx:101
msgid ""
"Are you sure about this setting? This may result in additional charges from "
"the API Provider"
msgstr ""