import { CircleHelp, Settings2 } from 'lucide-react'; import { useTranslations } from 'next-intl'; 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 { Switch } from '@/components/ui/switch'; import { Textarea } from '@/components/ui/textarea'; import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/tooltip'; import type { WAFIPGroup, WAFRuleNode } from '@/lib/services/openflare'; import { countryOptions, regionOptions, type GeoOption } from './geo-options'; import { NODE_TYPE_LABELS } from './node-factory'; import { UA_BROWSER_OPTIONS, UA_OS_OPTIONS } from './ua-options'; export function NodeProperties({ node, ipGroups, onChange, }: { node: WAFRuleNode; ipGroups: WAFIPGroup[]; onChange: (node: WAFRuleNode) => void; }) { const t = useTranslations('waf.editor'); return ( ); } function PropertyFields({ node, ipGroups, onChange, }: { node: WAFRuleNode; ipGroups: WAFIPGroup[]; onChange: (node: WAFRuleNode) => void; }) { const t = useTranslations('waf.editor'); if (node.type === 'start' || node.type === 'allow') return (

{t('systemNodeNoConfig')}

); 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 === 'ua_check') return (

{t('uaCheck')}

{t('enableUaCheck')} onChange({ ...node, config: { ...node.config, require_ua } }) } />
{node.config.require_ua && ( <>

{t('block')}

{t('blockBots')} onChange({ ...node, config: { ...node.config, block_common_bots }, }) } /> {t('blockAbnormal')} onChange({ ...node, config: { ...node.config, block_abnormal_ua }, }) } /> {t('blockCustom')} onChange({ ...node, config: { ...node.config, block_custom_ua }, }) } /> {node.config.block_custom_ua && ( {t('customUaPatterns')}