feat: add gname applicant

This commit is contained in:
Fu Diwei
2025-01-24 03:42:34 +08:00
parent 469d4b35c1
commit 0e1a964e7c
19 changed files with 400 additions and 43 deletions

View File

@@ -0,0 +1 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="2000" viewBox="0 0 81 81" enable-background="new 0 0 81 81" xml:space="preserve"><image width="81" height="81" x="0" y="0" xlink:href="data:image/png;base64,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" /></svg>

View File

File diff suppressed because one or more lines are too long

View File

@@ -19,6 +19,7 @@ import AccessFormCloudflareConfig from "./AccessFormCloudflareConfig";
import AccessFormClouDNSConfig from "./AccessFormClouDNSConfig";
import AccessFormDogeCloudConfig from "./AccessFormDogeCloudConfig";
import AccessFormEdgioConfig from "./AccessFormEdgioConfig";
import AccessFormGnameConfig from "./AccessFormGnameConfig";
import AccessFormGoDaddyConfig from "./AccessFormGoDaddyConfig";
import AccessFormHuaweiCloudConfig from "./AccessFormHuaweiCloudConfig";
import AccessFormKubernetesConfig from "./AccessFormKubernetesConfig";
@@ -106,6 +107,8 @@ const AccessForm = forwardRef<AccessFormInstance, AccessFormProps>(({ className,
return <AccessFormClouDNSConfig {...nestedFormProps} />;
case ACCESS_PROVIDERS.DOGECLOUD:
return <AccessFormDogeCloudConfig {...nestedFormProps} />;
case ACCESS_PROVIDERS.GNAME:
return <AccessFormGnameConfig {...nestedFormProps} />;
case ACCESS_PROVIDERS.GODADDY:
return <AccessFormGoDaddyConfig {...nestedFormProps} />;
case ACCESS_PROVIDERS.EDGIO:

View File

@@ -0,0 +1,76 @@
import { useTranslation } from "react-i18next";
import { Form, type FormInstance, Input } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import { type AccessConfigForGname } from "@/domain/access";
type AccessFormGnameConfigFieldValues = Nullish<AccessConfigForGname>;
export type AccessFormGnameConfigProps = {
form: FormInstance;
formName: string;
disabled?: boolean;
initialValues?: AccessFormGnameConfigFieldValues;
onValuesChange?: (values: AccessFormGnameConfigFieldValues) => void;
};
const initFormModel = (): AccessFormGnameConfigFieldValues => {
return {
appId: "",
appKey: "",
};
};
const AccessFormGnameConfig = ({ form: formInst, formName, disabled, initialValues, onValuesChange }: AccessFormGnameConfigProps) => {
const { t } = useTranslation();
const formSchema = z.object({
appId: z
.string()
.min(1, t("access.form.gname_app_id.placeholder"))
.max(64, t("common.errmsg.string_max", { max: 64 }))
.trim(),
appKey: z
.string()
.min(1, t("access.form.gname_app_key.placeholder"))
.max(64, t("common.errmsg.string_max", { max: 64 }))
.trim(),
});
const formRule = createSchemaFieldRule(formSchema);
const handleFormChange = (_: unknown, values: z.infer<typeof formSchema>) => {
onValuesChange?.(values);
};
return (
<Form
form={formInst}
disabled={disabled}
initialValues={initialValues ?? initFormModel()}
layout="vertical"
name={formName}
onValuesChange={handleFormChange}
>
<Form.Item
name="appId"
label={t("access.form.gname_app_id.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.gname_app_id.tooltip") }}></span>}
>
<Input autoComplete="new-password" placeholder={t("access.form.gname_app_id.placeholder")} />
</Form.Item>
<Form.Item
name="appKey"
label={t("access.form.gname_app_key.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.gname_app_key.tooltip") }}></span>}
>
<Input.Password autoComplete="new-password" placeholder={t("access.form.gname_app_key.placeholder")} />
</Form.Item>
</Form>
);
};
export default AccessFormGnameConfig;

View File

@@ -18,6 +18,7 @@ export interface AccessModel extends BaseModel {
| AccessConfigForClouDNS
| AccessConfigForDogeCloud
| AccessConfigForEdgio
| AccessConfigForGname
| AccessConfigForGoDaddy
| AccessConfigForHuaweiCloud
| AccessConfigForKubernetes
@@ -91,6 +92,11 @@ export type AccessConfigForEdgio = {
clientSecret: string;
};
export type AccessConfigForGname = {
appId: string;
appKey: string;
};
export type AccessConfigForGoDaddy = {
apiKey: string;
apiSecret: string;

View File

@@ -13,6 +13,7 @@ export const ACCESS_PROVIDERS = Object.freeze({
CLOUDFLARE: "cloudflare",
CLOUDNS: "cloudns",
DOGECLOUD: "dogecloud",
GNAME: "gname",
GODADDY: "godaddy",
EDGIO: "edgio",
HUAWEICLOUD: "huaweicloud",
@@ -73,6 +74,7 @@ export const accessProvidersMap: Map<AccessProvider["type"] | string, AccessProv
[ACCESS_PROVIDERS.AZURE, "common.provider.azure", "/imgs/providers/azure.svg", ACCESS_USAGES.APPLY],
[ACCESS_PROVIDERS.CLOUDFLARE, "common.provider.cloudflare", "/imgs/providers/cloudflare.svg", ACCESS_USAGES.APPLY],
[ACCESS_PROVIDERS.CLOUDNS, "common.provider.cloudns", "/imgs/providers/cloudns.svg", ACCESS_USAGES.APPLY],
[ACCESS_PROVIDERS.GNAME, "common.provider.gname", "/imgs/providers/gname.svg", ACCESS_USAGES.APPLY],
[ACCESS_PROVIDERS.GODADDY, "common.provider.godaddy", "/imgs/providers/godaddy.svg", ACCESS_USAGES.APPLY],
[ACCESS_PROVIDERS.NAMEDOTCOM, "common.provider.namedotcom", "/imgs/providers/namedotcom.svg", ACCESS_USAGES.APPLY],
[ACCESS_PROVIDERS.NAMESILO, "common.provider.namesilo", "/imgs/providers/namesilo.svg", ACCESS_USAGES.APPLY],
@@ -107,6 +109,7 @@ export const APPLY_DNS_PROVIDERS = Object.freeze({
AZURE_DNS: `${ACCESS_PROVIDERS.AZURE}-dns`,
CLOUDFLARE: `${ACCESS_PROVIDERS.CLOUDFLARE}`,
CLOUDNS: `${ACCESS_PROVIDERS.CLOUDNS}`,
GNAME: `${ACCESS_PROVIDERS.GNAME}`,
GODADDY: `${ACCESS_PROVIDERS.GODADDY}`,
HUAWEICLOUD: `${ACCESS_PROVIDERS.HUAWEICLOUD}`, // 兼容旧值,等同于 `HUAWEICLOUD_DNS`
HUAWEICLOUD_DNS: `${ACCESS_PROVIDERS.HUAWEICLOUD}-dns`,
@@ -145,6 +148,7 @@ export const applyDNSProvidersMap: Map<ApplyDNSProvider["type"] | string, ApplyD
[APPLY_DNS_PROVIDERS.AZURE_DNS, "common.provider.azure.dns"],
[APPLY_DNS_PROVIDERS.CLOUDFLARE, "common.provider.cloudflare"],
[APPLY_DNS_PROVIDERS.CLOUDNS, "common.provider.cloudns"],
[APPLY_DNS_PROVIDERS.GNAME, "common.provider.gname"],
[APPLY_DNS_PROVIDERS.GODADDY, "common.provider.godaddy"],
[APPLY_DNS_PROVIDERS.NAMEDOTCOM, "common.provider.namedotcom"],
[APPLY_DNS_PROVIDERS.NAMESILO, "common.provider.namesilo"],

View File

@@ -90,6 +90,12 @@
"access.form.edgio_client_secret.label": "Edgio ClientSecret",
"access.form.edgio_client_secret.placeholder": "Please enter Edgio ClientSecret",
"access.form.edgio_client_secret.tooltip": "For more information, see <a href=\"https://docs.edg.io/applications/v7/rest_api/authentication#administering-api-clients\" target=\"_blank\">https://docs.edg.io/applications/v7/rest_api/authentication#administering-api-clients</a>",
"access.form.gname_app_id.label": "GNAME AppId",
"access.form.gname_app_id.placeholder": "Please enter GNAME AppId",
"access.form.gname_app_id.tooltip": "For more information, see <a href=\"https://www.gname.com/user#/dealer_api\" target=\"_blank\">https://www.gname.com/user#/dealer_api</a>",
"access.form.gname_app_key.label": "GNAME AppKey",
"access.form.gname_app_key.placeholder": "Please enter GNAME AppKey",
"access.form.gname_app_key.tooltip": "For more information, see <a href=\"https://www.gname.com/user#/dealer_api\" target=\"_blank\">https://www.gname.com/user#/dealer_api</a>",
"access.form.godaddy_api_key.label": "GoDaddy API key",
"access.form.godaddy_api_key.placeholder": "Please enter GoDaddy API key",
"access.form.godaddy_api_key.tooltip": "For more information, see <a href=\"https://developer.godaddy.com/\" target=\"_blank\">https://developer.godaddy.com/</a>",

View File

@@ -61,6 +61,7 @@
"common.provider.dogecloud.cdn": "Doge Cloud - CDN (Content Delivery Network)",
"common.provider.edgio": "Edgio",
"common.provider.edgio.applications": "Edgio - Applications",
"common.provider.gname": "GNAME",
"common.provider.godaddy": "GoDaddy",
"common.provider.huaweicloud": "Huawei Cloud",
"common.provider.huaweicloud.cdn": "Huawei Cloud - CDN (Content Delivery Network)",

View File

@@ -90,6 +90,12 @@
"access.form.edgio_client_secret.label": "Edgio 客户端密码",
"access.form.edgio_client_secret.placeholder": "请输入 Edgio 客户端密码",
"access.form.edgio_client_secret.tooltip": "这是什么?请参阅 <a href=\"https://docs.edg.io/applications/v7/rest_api/authentication#administering-api-clients\" target=\"_blank\">https://docs.edg.io/applications/v7/rest_api/authentication#administering-api-clients</a>",
"access.form.gname_app_id.label": "GNAME AppId",
"access.form.gname_app_id.placeholder": "请输入 GNAME AppId",
"access.form.gname_app_id.tooltip": "这是什么?请参阅 <a href=\"https://www.gname.com/user#/dealer_api\" target=\"_blank\">https://www.gname.com/user#/dealer_api</a>",
"access.form.gname_app_key.label": "GNAME AppKey",
"access.form.gname_app_key.placeholder": "请输入 GNAME AppKey",
"access.form.gname_app_key.tooltip": "这是什么?请参阅 <a href=\"https://www.gname.com/user#/dealer_api\" target=\"_blank\">https://www.gname.com/user#/dealer_api</a>",
"access.form.godaddy_api_key.label": "GoDaddy API Key",
"access.form.godaddy_api_key.placeholder": "请输入 GoDaddy API Key",
"access.form.godaddy_api_key.tooltip": "这是什么?请参阅 <a href=\"https://developer.godaddy.com/\" target=\"_blank\">https://developer.godaddy.com/</a>",

View File

@@ -61,6 +61,7 @@
"common.provider.dogecloud.cdn": "多吉云 - 内容分发网络 CDN",
"common.provider.edgio": "Edgio",
"common.provider.edgio.applications": "Edgio - Applications",
"common.provider.gname": "GNAME",
"common.provider.godaddy": "GoDaddy",
"common.provider.huaweicloud": "华为云",
"common.provider.huaweicloud.cdn": "华为云 - 内容分发网络 CDN",