import { useTranslation } from 'react-i18next'; import { Button, Divider, Form, Input, InputNumber, Space, Switch } from 'antd'; import { MinusOutlined, PlusOutlined, ReloadOutlined } from '@ant-design/icons'; import { Wireguard } from '@/utils'; interface WireguardFieldsProps { wgPubKey: string; regenInboundWg: () => void; regenWgPeerKeypair: (name: number) => void; } function nextWgPeerAllowedIP(peers: Array<{ allowedIPs?: string[] }> | undefined): string { const fallback = '10.0.0.2/32'; let maxInt = -1; let prefix = 32; for (const peer of peers ?? []) { for (const ip of peer?.allowedIPs ?? []) { const m = /^\s*(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})(?:\/(\d{1,2}))?\s*$/.exec(String(ip)); if (!m) continue; const octets = [Number(m[1]), Number(m[2]), Number(m[3]), Number(m[4])]; if (octets.some((o) => o > 255)) continue; const asInt = octets[0] * 16777216 + octets[1] * 65536 + octets[2] * 256 + octets[3]; if (asInt > maxInt) { maxInt = asInt; prefix = m[5] !== undefined ? Math.min(Number(m[5]), 32) : 32; } } } if (maxInt < 0) return fallback; const next = maxInt + 1; const a = Math.floor(next / 16777216) % 256; const b = Math.floor(next / 65536) % 256; const c = Math.floor(next / 256) % 256; const d = next % 256; return `${a}.${b}.${c}.${d}/${prefix}`; } export default function WireguardFields({ wgPubKey, regenInboundWg, regenWgPeerKeypair }: WireguardFieldsProps) { const { t } = useTranslation(); const form = Form.useFormInstance(); return ( <> {fields.map((field, idx) => (
{t('pages.inbounds.info.peerNumber', { n: idx + 1 })} {fields.length > 1 && ( {ipFields.map((ipField) => ( {ipFields.length > 1 && ( )} ))} )}
))} )} ); }