/** * DomainForm Component * Dialog for creating and editing domain configurations */ import React from "react"; import { Modal, Form, Input, Select, Button, Space, message } from "antd"; import { createStyles } from "antd-style"; import { useDomainStore } from "@renderer/stores"; import type { Domain } from "@renderer/types/domain"; import type { CreateDomainParams, UpdateDomainParams, } from "@renderer/types/ipc"; const useStyles = createStyles(({ token, css }) => ({ form: css` .ant-form-item { margin-bottom: ${token.marginMD}px; } `, passwordHint: css` color: ${token.colorTextSecondary}; font-size: ${token.fontSizeSM}px; margin-top: ${token.marginXXS}px; `, })); interface DomainFormProps { open: boolean; onClose: () => void; domainId: string | null; } const DomainForm: React.FC = ({ open, onClose, domainId }) => { const { styles } = useStyles(); const [form] = Form.useForm(); const { domains, createDomain, updateDomainById, loading } = useDomainStore(); const isEdit = !!domainId; const editingDomain = domainId ? domains.find((d) => d.id === domainId) : null; // Reset form when dialog opens React.useEffect(() => { if (open) { if (editingDomain) { form.setFieldsValue({ name: editingDomain.name, domain: editingDomain.domain, username: editingDomain.username, authType: editingDomain.authType, apiToken: editingDomain.apiToken || "", }); } else { form.resetFields(); form.setFieldsValue({ authType: "password" }); } } }, [open, editingDomain, form]); const handleSubmit = async () => { try { const values = await form.validateFields(); // Process domain: remove protocol prefix and trailing slashes let processedDomain = values.domain.trim(); if (processedDomain.startsWith("https://")) { processedDomain = processedDomain.slice(8); } else if (processedDomain.startsWith("http://")) { processedDomain = processedDomain.slice(7); } processedDomain = processedDomain.replace(/\/+$/, ""); // Use domain as name if name is empty const name = values.name?.trim() || processedDomain; if (isEdit && editingDomain) { const params: UpdateDomainParams = { id: domainId, name, domain: processedDomain, username: values.username, authType: values.authType, apiToken: values.authType === "api_token" ? values.apiToken : undefined, }; // Only include password if provided if (values.password) { params.password = values.password; } const success = await updateDomainById(params); if (success) { message.success("Domain 更新成功"); onClose(); } else { message.error("更新失败"); } } else { const params: CreateDomainParams = { name, domain: processedDomain, username: values.username, password: values.password, authType: values.authType, apiToken: values.authType === "api_token" ? values.apiToken : undefined, }; const success = await createDomain(params); if (success) { message.success("Domain 创建成功"); onClose(); } else { message.error("创建失败"); } } } catch (error) { console.error("Form validation failed:", error); } }; const authType = Form.useWatch("authType", form); const [testing, setTesting] = React.useState(false); // Test connection with current form values const handleTestConnection = async () => { try { const values = await form.validateFields([ "domain", "username", "authType", "password", "apiToken", ]); // Process domain let processedDomain = values.domain.trim(); if (processedDomain.startsWith("https://")) { processedDomain = processedDomain.slice(8); } else if (processedDomain.startsWith("http://")) { processedDomain = processedDomain.slice(7); } processedDomain = processedDomain.replace(/\/+$/, ""); setTesting(true); const result = await window.api.testDomainConnection({ domain: processedDomain, username: values.username, authType: values.authType, password: values.authType === "password" ? values.password : undefined, apiToken: values.authType === "api_token" ? values.apiToken : undefined, }); if (result.success) { message.success("连接成功"); } else { message.error(result.error || "连接失败"); } } catch (error) { console.error("Test connection failed:", error); } finally { setTesting(false); } }; return (
{ if (!value) return Promise.resolve(); // Allow https:// or http:// prefix let domain = value.trim(); if (domain.startsWith("https://")) { domain = domain.slice(8); } else if (domain.startsWith("http://")) { domain = domain.slice(7); } // Remove trailing slashes domain = domain.replace(/\/+$/, ""); // Validate domain format if (/^[\w.-]+$/.test(domain)) { return Promise.resolve(); } return Promise.reject(new Error("请输入有效的域名")); }, }, ]} > {authType === "password" && ( )} {authType === "api_token" && ( )}
); }; export default DomainForm;