import { useState, ReactNode } from 'react'; import { NodeData, Settings, NodeDataUpdate } from '../types/graph'; import { generateWireGuardPrivateKey } from '../utils/wireguardConfig' import { IPNetwork} from '../utils/iputils' import './FormEditor.css'; import Folder from './Folder' interface NodeEditorProps { node: NodeData; settings: Settings; onUpdate: (data: NodeDataUpdate) => void; onClose: () => void; } function Validate(updateData : NodeDataUpdate, settings : Settings) : string[] { const errors: string[] = []; const {ipv4Address, ipv6Address, mtu, listenPort} = updateData; if(!updateData.label) { errors.push("Label不能是空"); } if(!updateData.privateKey) { errors.push("privateKey不能是空"); } if(ipv4Address) { const result = IPNetwork.parse(ipv4Address); if(!result.cidr || result.cidr.version !== 'IPv4') { errors.push("IPv4地址无效"); } } if(ipv6Address) { const result = IPNetwork.parse(ipv6Address); if(!result.cidr || result.cidr.version !== 'IPv6') { errors.push("IPv6地址无效"); } } if(listenPort !== undefined) { if(isNaN(listenPort)) { errors.push("监听端口不是数字"); } else if(listenPort < 30000 || listenPort > 49151) { errors.push("监听端口不在范围内:[30000, 49151]"); } } if(mtu !== undefined) { if(isNaN(mtu)) { errors.push("mtu不是数字"); } else if(mtu < 1200) { errors.push("mtu过小(小于1200)"); } } return errors; } export default function NodeEditor({ node, settings, onUpdate, onClose }: NodeEditorProps): ReactNode { const [errors, setErrors] = useState([]); const [label, setLabel] = useState(node.label); const [privateKey, setPrivateKey] = useState(node.privateKey); const [ipv4Address, setIpv4Address] = useState(node.ipv4Address); const [ipv6Address, setIpv6Address] = useState(node.ipv6Address); const [disallowIPs, setDisallowIPs] = useState(node.disallowIPs); const [listenPort, setListenPort] = useState(node.listenPort); const [mtu, setmtu] = useState(node.mtu); const [dnsServers, setdnsServers] = useState(node.dnsServers) const [postUp, setPostUp] = useState(node.postUp) const [postDown, setPostDown] = useState(node.postDown) const [notes, setNotes] = useState(node.notes) const handleSave = (): void => { const updateData : NodeDataUpdate = { label: label, privateKey: privateKey, ipv4Address: ipv4Address, ipv6Address: ipv6Address, disallowIPs: disallowIPs, postUp: postUp, postDown: postDown, mtu: mtu, listenPort: listenPort, dnsServers: dnsServers, notes: notes } const validation = Validate(updateData, settings); setErrors(validation); if(validation.length > 0) { return ; } onUpdate(updateData); onClose(); }; return (

编辑节点: {label}

{errors.length > 0 && (
setErrors([])} // 点击清空错误数组 title="关闭提示" >×
{errors.map((error, idx) => (

• {error}

))}
)}
setLabel(e.target.value)} placeholder="例如: Node-A" />
setIpv4Address(e.target.value)} placeholder={`例如:172.29.0.1/16,留空代表不使用ipv4`} />
setIpv6Address(e.target.value)} placeholder={`例如:fd23:23:23::1/64,留空代表不使用ipv6`} />