import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { Plus } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from "@/components/ui/select"; import { ScrollArea } from "@/components/ui/scroll-area"; import AccessEditDialog from "./AccessEditDialog"; import { Context as DeployEditContext } from "./DeployEdit"; import DeployToAliyunOSS from "./DeployToAliyunOSS"; import DeployToAliyunCDN from "./DeployToAliyunCDN"; import DeployToAliyunCLB from "./DeployToAliyunCLB"; import DeployToAliyunALB from "./DeployToAliyunALB"; import DeployToTencentCDN from "./DeployToTencentCDN"; import DeployToTencentCLB from "./DeployToTencentCLB"; import DeployToTencentCOS from "./DeployToTencentCOS"; import DeployToHuaweiCloudCDN from "./DeployToHuaweiCloudCDN"; import DeployToHuaweiCloudELB from "./DeployToHuaweiCloudELB"; import DeployToQiniuCDN from "./DeployToQiniuCDN"; import DeployToSSH from "./DeployToSSH"; import DeployToWebhook from "./DeployToWebhook"; import DeployToKubernetesSecret from "./DeployToKubernetesSecret"; import { deployTargetsMap, type DeployConfig } from "@/domain/domain"; import { accessProvidersMap } from "@/domain/access"; import { useConfigContext } from "@/providers/config"; type DeployEditDialogProps = { trigger: React.ReactNode; deployConfig?: DeployConfig; onSave: (deploy: DeployConfig) => void; }; const DeployEditDialog = ({ trigger, deployConfig, onSave }: DeployEditDialogProps) => { const { t } = useTranslation(); const { config: { accesses }, } = useConfigContext(); const [deployType, setDeployType] = useState(""); const [locDeployConfig, setLocDeployConfig] = useState({ access: "", type: "", }); const [error, setError] = useState>({}); const [open, setOpen] = useState(false); useEffect(() => { if (deployConfig) { setLocDeployConfig({ ...deployConfig }); } else { setLocDeployConfig({ access: "", type: "", }); } }, [deployConfig]); useEffect(() => { setDeployType(locDeployConfig.type); setError({}); }, [locDeployConfig.type]); const setDeploy = useCallback( (deploy: DeployConfig) => { if (deploy.type !== locDeployConfig.type) { setLocDeployConfig({ ...deploy, access: "", config: {} }); } else { setLocDeployConfig({ ...deploy }); } }, [locDeployConfig.type] ); const targetAccesses = accesses.filter((item) => { if (item.usage == "apply") { return false; } if (locDeployConfig.type == "") { return true; } return item.configType === deployTargetsMap.get(locDeployConfig.type)?.provider; }); const handleSaveClick = () => { // 验证数据 const newError = { ...error }; newError.type = locDeployConfig.type === "" ? t("domain.deployment.form.access.placeholder") : ""; newError.access = locDeployConfig.access === "" ? t("domain.deployment.form.access.placeholder") : ""; setError(newError); if (Object.values(newError).some((e) => !!e)) return; // 保存数据 onSave(locDeployConfig); // 清理数据 setLocDeployConfig({ access: "", type: "", }); setError({}); // 关闭弹框 setOpen(false); }; let childComponent = <>; switch (deployType) { case "aliyun-oss": childComponent = ; break; case "aliyun-cdn": case "aliyun-dcdn": childComponent = ; break; case "aliyun-clb": childComponent = ; break; case "aliyun-alb": childComponent = ; break; case "tencent-cdn": childComponent = ; break; case "tencent-clb": childComponent = ; break; case "tencent-cos": childComponent = ; break; case "huaweicloud-cdn": childComponent = ; break; case "huaweicloud-elb": childComponent = ; break; case "qiniu-cdn": childComponent = ; break; case "ssh": case "local": childComponent = ; break; case "webhook": childComponent = ; break; case "k8s-secret": childComponent = ; break; } return ( {trigger} {t("domain.deployment.tab")}
{/* 部署方式 */}
{error.type}
{/* 授权配置 */}
} op="add" />
{error.access}
{/* 其他参数 */}
{childComponent}
); }; export default DeployEditDialog;