import { Settings2 } from 'lucide-react'; import { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Checkbox } from '@/components/ui/checkbox'; import { Field, FieldDescription, FieldGroup, FieldLabel, } from '@/components/ui/field'; import { Input } from '@/components/ui/input'; import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Separator } from '@/components/ui/separator'; import { Textarea } from '@/components/ui/textarea'; import type { WAFIPGroup, WAFRuleNode } from '@/lib/services/openflare'; import { countryOptions, regionOptions, type GeoOption } from './geo-options'; export function NodeProperties({ node, ipGroups, onChange, }: { node: WAFRuleNode; ipGroups: WAFIPGroup[]; onChange: (node: WAFRuleNode) => void; }) { return ( ); } function PropertyFields({ node, ipGroups, onChange, }: { node: WAFRuleNode; ipGroups: WAFIPGroup[]; onChange: (node: WAFRuleNode) => void; }) { if (node.type === 'start' || node.type === 'allow') return

系统节点无需配置。

; if (node.type === 'ip_match') return ( onChange({ ...node, config: { ...node.config, ips } }) } /> onChange({ ...node, config: { ...node.config, cidrs } }) } /> ({ value: String(group.id), label: group.name, searchText: `${group.name} ${group.id}`, }))} value={node.config.ip_group_ids.map(String)} onChange={(values) => onChange({ ...node, config: { ...node.config, ip_group_ids: values.map(Number) }, }) } /> ); if (node.type === 'geo_match') return ( onChange({ ...node, config: { ...node.config, countries } }) } /> onChange({ ...node, config: { ...node.config, regions } }) } /> ); if (node.type === 'pow') return ( 算法 {(['difficulty', 'session_ttl', 'challenge_ttl'] as const).map( (key) => ( onChange({ ...node, config: { ...node.config, [key]: value } }) } /> ), )} ); return ( onChange({ ...node, config: { ...node.config, status_code } }) } /> HTML 响应体