'use client'; import {useEffect, useMemo, useState} from 'react'; import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query'; import {toast} from 'sonner'; import {Badge} from '@/components/ui/badge'; import {EmptyStateWithBorder} from '@/components/layout/empty'; import {ErrorInline} from '@/components/layout/error'; import {LoadingStateWithBorder} from '@/components/layout/loading'; import type {ProxyRouteItem} from '@/lib/services/openflare'; import {WafService} from '@/lib/services/openflare'; import {cn} from '@/lib/utils'; import {getErrorMessage} from '../../components/helpers'; import {proxyRouteFormIds} from '../helpers'; import {SectionShell} from './section-shell'; interface WafSectionProps { route: ProxyRouteItem; onSavingChange?: (saving: boolean) => void; } export function WafSection({ route, onSavingChange }: WafSectionProps) { const queryClient = useQueryClient(); const [selectedIDs, setSelectedIDs] = useState([]); const wafQuery = useQuery({ queryKey: ['openflare', 'waf', 'site-rule-groups', route.id], queryFn: () => WafService.listSiteRuleGroups(route.id), }); const wafMutation = useMutation({ mutationFn: (ids: number[]) => WafService.updateSiteRuleGroups(route.id, ids), onMutate: () => { onSavingChange?.(true); }, onSettled: () => { onSavingChange?.(false); }, onSuccess: async (result) => { setSelectedIDs(result.applied_ids); toast.success('WAF 规则组已更新'); await Promise.all([ queryClient.invalidateQueries({ queryKey: ['openflare', 'waf', 'site-rule-groups', route.id], }), queryClient.invalidateQueries({ queryKey: ['openflare', 'waf', 'rule-groups'] }), queryClient.invalidateQueries({ queryKey: ['openflare', 'config-versions', 'diff'] }), ]); }, onError: (error) => { toast.error('保存失败', { description: getErrorMessage(error) }); }, }); useEffect(() => { if (wafQuery.data) { setSelectedIDs(wafQuery.data.applied_ids); } }, [wafQuery.data]); const selectedSet = useMemo(() => new Set(selectedIDs), [selectedIDs]); return ( {wafQuery.isLoading ? ( ) : wafQuery.isError ? ( void wafQuery.refetch()} /> ) : (
{ event.preventDefault(); wafMutation.mutate(selectedIDs); }} > {wafQuery.data?.global_rule_group ? (

Global Rule Group

{wafQuery.data.global_rule_group.name}

始终生效
) : null}
{(wafQuery.data?.rule_groups ?? []).map((group) => ( ))}
{(wafQuery.data?.rule_groups ?? []).length === 0 ? ( ) : null} )}
); }