'use client'; import { useState } from 'react'; import { buildUfwCommands, buildNftablesRuleset, type FirewallOptions, type PortProtocol, type PortRule, } from '@/lib/xray/firewall'; import { ToolFrame } from './tool-frame'; import { CheckboxField } from './shared/fields'; import { OutputBlock } from './shared/output-block'; interface Row { label: string; port: string; protocol: PortProtocol; enabled: boolean; } const DEFAULT_ROWS: Row[] = [ { label: 'panel', port: '2053', protocol: 'tcp', enabled: true }, { label: 'subscription', port: '2096', protocol: 'tcp', enabled: false }, { label: 'inbound (HTTPS)', port: '443', protocol: 'tcp', enabled: true }, { label: 'inbound (UDP)', port: '443', protocol: 'udp', enabled: false }, ]; export function FirewallRulesGenerator() { const [allowSsh, setAllowSsh] = useState(true); const [sshPort] = useState('22'); const [rows, setRows] = useState(DEFAULT_ROWS); function toggle(index: number, enabled: boolean) { setRows((prev) => prev.map((r, i) => (i === index ? { ...r, enabled } : r))); } const ports: PortRule[] = rows .filter((r) => r.enabled && Number(r.port) > 0) .map((r) => ({ port: Number(r.port), protocol: r.protocol, label: r.label })); const options: FirewallOptions = { ports, allowSsh, sshPort: Number(sshPort) || 22 }; return (
{rows.map((row, i) => ( toggle(i, c)} /> ))}
); }